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

Reply via email to