Thanks for the clarification, I think this is the context I was missing. So this is a completely different type of access level, to either type-based or file-based? I'm still against making breaking changes, but I now understand why so many are supporting changing private.
Rereading the message I quoted (I now realise how badly I misinterpreted it), I think it does present a good case for keeping this scope-based keyword a separate keyword from the current ones. Type-based access would be a good feature to include eventually, as an indication of a variable/function's intended use more than anything (such as internal variables meant to be used in extensions). From James F > On 16 Mar 2016, at 11:11, Ilya Belenkiy <ilya.belen...@gmail.com> wrote: > > Type based access would be confusing, which is why the proposal was for > scoped based access. This means that something is visible only in the scope > in which it is defined and is completely sealed from outside of the scope. > This way you have to modify the scope to make something more visible, so you > can't just add another extension to make something more visible. > > > Limiting access using scope means another file/module can just add a > > property/function to make the value public. Confusing type-based and > > file-based access is a step backwards, and any attempt to add type-based > > access shouldn't be a breaking change. > >> On Wed, Mar 16, 2016 at 6:52 AM James Froggatt via swift-evolution >> <swift-evolution@swift.org> wrote: >> I agree with the proposal of ‘inherited’ & ‘declaration’ modifiers. >> >> Current access modifiers actually guarantee access. Limiting access using >> scope means another file/module can just add a property/function to make the >> value public. Confusing type-based and file-based access is a step >> backwards, and any attempt to add type-based access shouldn't be a breaking >> change. >> >> Replacing internal with private(module) also seems like a step backwards, to >> me, and in my opinion changes to the ‘internal’ keyword should be part of a >> separate proposal. >> >> Inherited & declaration modifiers compose well with existing >> access-modifiers, are clear in their purpose, can be applied to all access >> levels, and don't break existing code. >> >> ------------ Begin Message ------------ >> Group: gmane.comp.lang.swift.evolution >> MsgID: <capuwzk7yhzwdmtmuh1qvbojz3+9+ikgjvna3xdhscesvo8y...@mail.gmail.com> >> >> 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 < >> swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org> 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 < >> >patrickpijnappel-re5jqeeqqe8avxtiumw...@public.gmane.org> 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 < >> >patrickpijnappel-re5jqeeqqe8avxtiumw...@public.gmane.org> 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 < >> >>swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org> 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 >> >>>swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org >> >>>https://lists.swift.org/mailman/listinfo/swift-evolution >> >>> >> >>> >> >> >> > >> > >> >_______________________________________________ >> >swift-evolution mailing list >> >swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org >> >https://lists.swift.org/mailman/listinfo/swift-evolution >> > >> > >> >> >> >> ------------- End Message ------------- >> >> >> >> From James F >> _______________________________________________ >> swift-evolution mailing list >> swift-evolution@swift.org >> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution