~Robert Widmann

2016/06/16 0:29、Jonathan Hull <jh...@gbis.com> のメッセージ:

> They happen to be the same at the top level, but they are very different when 
> dealing with nested types…
> 
> A private member is visible inside it’s containing scope.  For the top-level, 
> that is the file.  For a nested type, that is the outer type.

A wonderful idea, but not in the proposal.  In fact, the singular example given 
therein runs directly counter to this idea by explicitly showing the scoping 
behavior of a private member.

> 
> You may, for instance have an outer type which is marked Internal or public, 
> but an inner type which is marked fileprivate so that extensions in the file 
> can use the inner type.  That is different than marking the inner type 
> private, which would only allow access inside the outer type, but not in 
> extensions.

That is defined behavior.  The inner private type's members are, however, still 
private and cannot escalate their access beyond that.

> 
> Again, I want to point out that the behavior I described in my earlier 
> message is the only plausible/usable behavior because we have no other way to 
> specify that a member should have the same visibility as it’s enclosing 
> scope… which is a common and important use-case.  Doing it your way, as you 
> point out in your original message, leads to the problem of having no way to 
> instantiate types marked private.

Then we should amend the proposal posthaste!

> 
> This was all thoroughly discussed during the proposal process, with lots of 
> people talking about the fact that private & fileprivate are the same at the 
> top level… and the response was that, yes, this is by design.  In most cases 
> you can continue to just use the shorter private, and you only need to bring 
> in fileprivate for nested types.  Fileprivate is one of those things that you 
> REALLY need when you need it though, which is why it was included.

Good to know I'm not the only one with reservations.

> 
> Thanks,
> Jon
> 
> 
>> On Jun 16, 2016, at 12:06 AM, Robert Widmann <devteam.cod...@gmail.com> 
>> wrote:
>> 
>> But the proposal does not specify that and that is not how swift's access 
>> control mechanisms currently work, unfortunately.  A private aggregate must 
>> have private members, and those members are subject to private access 
>> whether annotated or not.
>> 
>> On top of that, you break containment this way.  A private member is not 
>> supposed to be visible outside of its current declaration.  An aggregate 
>> full of private members similarly.  You can see the aggregate, but you 
>> cannot see its members.  If we relax this, then private is no different from 
>> fileprivate and we should just stick to our current tri-valued access 
>> control system.
>> 
>> ~Robert Widmann
>> 
>> 2016/06/15 23:04、Jonathan Hull via swift-evolution 
>> <swift-evolution@swift.org> のメッセージ:
>> 
>>> My understanding of the proposal was that the unannotated 
>>> properties/methods inside of a scope have the same *visibility* as their 
>>> surrounding scope, or internal, whichever is less.
>>> 
>>> That is slightly different than having the same access level.  Thus:
>>> 
>>> private struct Outer {
>>>    var inner:Int
>>> }
>>> 
>>> is different than:
>>> 
>>> private struct Outer {
>>>    private var inner:Int
>>> }
>>> 
>>> In the first, inner is accessible precisely everywhere where Outer is 
>>> accessible.  In the second, inner is only accessible within Outer itself.  
>>> It is important that we have the first behavior for unannotated inner, 
>>> because there is no other way to spell it.
>>> 
>>> That is my understanding of the intent of SE-0025, even if the exact 
>>> wording is confusing.
>>> 
>>> Thanks,
>>> Jon
>>> 
>>> P.S.  I would personally like to see unannotated properties/methods inside 
>>> of a scope have the same visibility as their surrounding scope. Full stop. 
>>> End of sentence.  (It seems to me like the special handling of internal is 
>>> what is causing the confusion here).  That is what I would expect the 
>>> behavior to be if I didn’t know.  That isn’t what was written in the 
>>> proposal though...
>>> 
>>>> While implementing SE-0025 (fileprivate), I noticed an interesting bug in 
>>>> the proposal.  Under the implementation outlined there, any top-level 
>>>> structure, class, or enum declared private cannot possibly be instantiated 
>>>> and so cannot be used in any way.  Because of this, private top-level 
>>>> declarations are more often than not blown away entirely by the compiler 
>>>> for being unused.  It seems strange to me to allow a key language feature 
>>>> to act solely as a hint to the optimizer to reduce the size of your 
>>>> binary.  Perhaps the restrictions around private needs to be relaxed or 
>>>> the line between fileprivate and private needs to be investigated again by 
>>>> the community before inclusion in the language.
>>>> 
>>>> Thoughts?
>>>> 
>>>> ~Robert Widmann
>>> 
>>> _______________________________________________
>>> 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

Reply via email to