SE-0025 did not include any type-based access control. I personally would like to keep Swift free of type-based access control, and I think the core team feels the same way. "The world, the module, the file, the current lexical scope" is a properly nested set of scopes that are not defined in terms of types.
I think discussion of type-based access control should happen on a different thread. As you say, it would be orthogonal to any refinements of SE-0025. Jordan > On Mar 15, 2016, at 17:26 , Ross O'Brien via swift-evolution > <[email protected]> wrote: > > It's occurring to me, reading these recent posts, that we have two orthogonal > systems of access levels. > > Swift's current access system is file based; a project file decides which > files comprise a module, and the terms 'public', 'internal' and 'private' > determine whether a property is accessible to all, accessible only within > files of the module, or accessible only within a file. (This takes on an > extra dimension as files may belong to several modules). > > The concept which began this discussion, and several of the proposed concepts > in this discussion, ask instead for a type-based access system similar to > those in other languages including Objective-C, where 'public', 'protected' > and 'private' are the terms of choice and they restrict access to a type or > subtypes. > > I think it would be confusing if Swift applied 'public' to a concept in the > file-based access system and 'private' to a concept in the type-based access > system. > > I would prefer clearer terms which actually mention the restrictions of the > level. For example, 'inherited', not 'protected', in the case of properties > accessible by a class and its subclasses; 'declaration', rather than > 'private' or 'scoped', to refer to properties only accessible within a given > type or extension declaration. > > Since, at the moment, a declaration can only occur within one file, I think > this most-restricted level has managed to pass as a level of the file-based > access system. However, if the system is ever extended, we're going to run > into new syntax decisions where we have 'private module' functions > (accessible only within the given type in the same module) trying to > communicate with 'protected file' properties (accessible only with the type > and its subtypes in the same file), and that might lead to conflicts, so > perhaps we should decide how those might be declared now. > > On Tue, Mar 15, 2016 at 11:51 PM, Jonathan Hull via swift-evolution > <[email protected] <mailto:[email protected]>> wrote: > On Tue, Mar 15, 2016 at 2:33 PM Erica Sadun <erica at ericasadun.com > <https://lists.swift.org/mailman/listinfo/swift-evolution>> wrote: >> And again, moving the access control modification to the end just doesn't >> look >> right to me or seem to enhance readability. :( > I like Shawn’s proposal better for cases where there are custom getter/setter > implementations. We should definitely be able to do: > > var foo:Int { > public get {…} > private(file) set {…} > } > > In fact, that is what I first tried to do before learning about private(set). > But without the implementations, it just seems strange to put the scoping > after the rest of the declaration (they work above because they are before > the custom getter/setter). > > I still like the idea of having the option to use parameter-like syntax for > cases where you don’t have custom getters/setters: > > private var foo:Int > private(file) var foo:Int > private(set: file) var foo:Int > private(get: global, set: file) var foo:Int > > > I guess, if we had some way to represent the standard getter/setter, that > might work too. I don’t love it, but maybe with better wording? > > var foo:Int{ > public get useDefault > private(file) set {…} > } > > Thanks, > Jon > > >> On Mar 14, 2016, at 10:22 PM, Patrick Pijnappel <[email protected] >> <mailto:[email protected]>> wrote: >> >> I like Shawn's proposal: >> >> var foo: Int { private(file) set } >> >> In fact it's probably more sensible than the current private(set) IMO. >> >> For example, we already use >> >> var foo: Int { mutating get { ... } } >> >> and not >> >> mutating(get) var foo: Int { get { ... } } >> >> On Tue, Mar 15, 2016 at 4:13 PM, Patrick Pijnappel >> <[email protected] <mailto:[email protected]>> wrote: >> I like Shawn's proposal: >> >> var foo: Int { private(file) set } >> >> In fact it's probably more sensible than the current private(set) IMO. >> >> >> While I like private(get: file, set: module) idea, I think it just gets too >> inconsistent with private(set: public) and private(set: private) (?!) >> >> On Tue, Mar 15, 2016 at 3:39 PM, Jonathan Hull via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> On Mar 14, 2016, at 8:36 PM, Patrick Pijnappel via swift-evolution >> <swift-evolution at swift.org >> <https://lists.swift.org/mailman/listinfo/swift-evolution>> wrote: >>> The only question is (as Sean mentioned) how this combines with the syntax >>> for setter access level, e.g. the current private(set). Options: >>> - Unnamed 2nd argument, giving private(file), private(file, set), >>> private(set). >>> - Named 2nd argument, giving e.g. private(file), private(file, accessor: >>> set), private(accessor: set). Less ambiguity but longer. >>> - Not using multiple arguments, but that'd probably break consistency with >>> the other unification efforts going on to make everything look like >>> function calls. >> What about the following 3 forms? >> >> private(file) //both setter and getter have file scope >> private(set: file) //setter has file scope. Equivalent to current >> “private(set)" >> private(get: module, set: file) //getter has module scope & setter has file >> scope >> >> It is a bit weird, but we should probably also allow “public" in that last >> form: private(get: public, set: module) >> >> Thanks, >> Jon >> >> _______________________________________________ >> swift-evolution mailing list >> [email protected] <mailto:[email protected]> >> https://lists.swift.org/mailman/listinfo/swift-evolution >> <https://lists.swift.org/mailman/listinfo/swift-evolution> >> >> >> > > > _______________________________________________ > swift-evolution mailing list > [email protected] <mailto:[email protected]> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution> > > > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
