[swift-evolution] Type-based =?utf-8?Q?=E2=80=98private=E2=80=99_?=access within a file

Adrian Zubarev adrian.zubarev at devandartist.com
Mon Apr 3 14:01:45 CDT 2017

I mean an upgrade from private, please don’t get me wrong there for that typo.

Adrian Zubarev
Sent with Airmail

Am 3. April 2017 um 21:00:26, Adrian Zubarev (adrian.zubarev at devandartist.com) schrieb:

I must admit that’s a very interesting approach, however to me it feels like fileprivate will be a really small upgrade to private when you actually need it. Plus you could almost do everything with fileprivate instead of private. As Carlie Monroe said it will create a new source for confusion.

Adrian Zubarev
Sent with Airmail

Am 3. April 2017 um 20:35:05, Douglas Gregor via swift-evolution (swift-evolution at swift.org) schrieb:

Hello Swift Community,

In rejecting SE-0159, the core team described a potential direction we would like to investigate for “private” access control that admits a limited form of type-based access control within files. The core team is seeking some discussion here and a motivated volunteer to put together a proposal along these lines for review in the Swift 4 time-frame (i.e., very soon). To be clear, the core team it’s sure this is the right direction to go… but it appears promising and we would *love* to be able to settle the access-control issue.

The design, specifically, is that a “private” member declared within a type “X” or an extension thereof would be accessible from:

* An extension of “X” in the same file
* The definition of “X”, if it occurs in the same file
* A nested type (or extension thereof) of one of the above that occurs in the same file

This design has a number of apparent benefits:
+ “private” becomes the right default for “less than whole module” visibility, and aligns well with Swift coding style that divides a type’s definition into a number of extensions.
+ “fileprivate” remains for existing use cases, but now it’s use it more rare, which has several advantages:
+ It fits well with the "progressive disclosure” philosophy behind Swift: you can use public/internal/private for a while before encountering and having to learn about “fileprivate”   (note: we thought this was going to be true of SE-0025, but we were clearly wrong)
+ When “fileprivate” occurs, it means there’s some interesting coupling between different types in the same file. That makes fileprivate a useful alert to the reader rather than, potentially, something that we routinely use and overlook so that we can separate implementations into extensions.
+ “private” is more closely aligned with other programming languages that use type-based access control, which can help programmers just coming to Swift. When they reach for “private”, they’re likely to get something similar to what they expect—with a little Swift twist due to Swift’s heavy use of extensions.
+ Loosening the access restrictions on “private” is unlikely to break existing code.

There are likely some drawbacks:
- Developers using patterns that depend on the existing lexically-scoped access control of “private” may find this new interpretation of “private” to be insufficiently strict
- Swift’s access control would go from “entirely lexical” to “partly lexical and partly type-based”, which can be viewed as being more complicated

Thoughts? Volunteer?

- Doug
swift-evolution mailing list
swift-evolution at swift.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170403/1034101a/attachment.html>

More information about the swift-evolution mailing list