Then it is no different from fileprivate.

~Robert Widmann

2016/06/15 11:47、Matthew Johnson <matt...@anandabits.com> のメッセージ:

> 
>> On Jun 15, 2016, at 1:37 PM, Robert Widmann <devteam.cod...@gmail.com> wrote:
>> 
>> The scope of the *declaration* is not the issue.  The scope of its *members* 
>> is.
> 
> Let’s consider an example:
> 
> private struct Foo {
>    var bar: Int
> }
> 
> // elsewhere in the same file:
> var foo = Foo(bar: 42)
> foo.bar = 44
> 
> `Foo` is declared private.  Private for this declaration is at the file 
> scope.  The `bar` member has no access modifier so it has the same visibility 
> as the struct itself, which is file scope.  This will also be true of the 
> implicitly synthesized memberwise initializer.  
> 
> This means that it is possible to initialize `foo` with a newly constructed 
> instance of `Foo` and to modify the `bar` member anywhere else in the same 
> file.
> 
> If `bar` was also declared `private` this would not be possible as its 
> visibility would be restricted to the surrounding scope of the initial 
> declaration of `Foo`.  This means `Foo` would need to provide an explicit 
> initializer or factory method with `fileprivate` visibility in order to be 
> usable.
> 
> Members with no explicit access modifier should have the same *visibility* as 
> their containing type (with a maximum implicit visibility of internal), not 
> the same *modifier* as their containing type.  The only case where there is a 
> distinction is the new `private` visibility.  Maybe that is what is causing 
> the confusion?
> 
> Does this help?
> 
> -Matthew
> 
>> 
>> ~Robert Widmann
>> 
>> 2016/06/15 11:36、Matthew Johnson <matt...@anandabits.com> のメッセージ:
>> 
>>> The scope for a top-level declaration is the file itself.  This means that 
>>> top-level declarations with `private` and `fileprivate` should have the 
>>> same behavior.  They should not be uninstantiable or unusable.
>>> 
>>> -Matthew
>>> 
>>>> On Jun 15, 2016, at 1:31 PM, Robert Widmann via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> 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