[swift-evolution] SE-0025: Scoped Access Level, next steps
Ilya Belenkiy
ilya.belenkiy at gmail.com
Mon Mar 28 07:13:53 CDT 2016
After replying and seeing it in code, it felt so wrong, that I am updating
the proposal now. It should be Inner only.
On Mon, Mar 28, 2016 at 8:11 AM Matthew Judge <matthew.judge at gmail.com>
wrote:
> That is not clear to me in the proposal. The proposal states: "When a
> function or a property is defined with `private` access modifier, it is
> visible only within that lexical scope." The most immediate lexical scope
> for innerVar would be Inner.
>
> I'm not advocating either way, just that it be clear in the proposal.
>
> On Mon, Mar 28, 2016 at 7:48 AM, Ilya Belenkiy <ilya.belenkiy at gmail.com>
> wrote:
>
>> Outer
>>
>> On Mon, Mar 28, 2016 at 7:30 AM Matthew Judge <matthew.judge at gmail.com>
>> wrote:
>>
>>> On Mon, Mar 28, 2016 at 6:41 AM, Ilya Belenkiy <ilya.belenkiy at gmail.com>
>>> wrote:
>>>
>>>> lexical scope is the other way around: "inner" can see "outer". For
>>>> example:
>>>>
>>>> func f() {
>>>> let outer = 0
>>>> // f cannot use inner
>>>> func g() {
>>>> let inner = 1
>>>> // g can use outer
>>>> }
>>>> }
>>>>
>>>>
>>> Maybe I'm off in my terminology, but I think my code example matches
>>> what you are saying here (outer is visible to g() but inner is not visible
>>> to f()
>>>
>>>
>>>> It would work the same way for the access level. That said, I'd rather
>>>> not include this in the proposal.
>>>>
>>>
>>> So as the proposal stands now, what is the scope that innerVar is
>>> visible to in the following code: Inner or Outer?
>>>
>>> class Outer {
>>> class Inner {
>>> private var innerVar: Int
>>> }
>>> }
>>>
>>>
>>>> The only change that the core team requested was the name changes. I
>>>> personally would prefer a completely private version where you cannot
>>>> inject a class into a scope to get access to the scope internals, but it's
>>>> an edge case that could be argued either way, and I don't want to start
>>>> another lengthy discussion. We already had quite a few.
>>>>
>>>> On Sun, Mar 27, 2016 at 11:17 PM Matthew Judge <matthew.judge at gmail.com>
>>>> wrote:
>>>>
>>>>> I know it was suggested that it be the subject of a different thread,
>>>>> but it might be good to clarify how the new private is going to work (or at
>>>>> least what is currently envisioned).
>>>>>
>>>>> My understanding is that the new private would be:
>>>>> - visible only to the immediately enclosing scope
>>>>> - including the scope of a inner nested scope
>>>>> - not including the scope of an outer nested scope
>>>>> - not visible to an extension
>>>>>
>>>>> Said in code (all in the same file):
>>>>> ----------
>>>>> class Outer { // Outer visible to module
>>>>> private var a: Int // visible to Outer, Inner1, & Inner2
>>>>>
>>>>> class Inner1 { // Inner1 visible to module
>>>>> private var b: Int // visible to Inner1 only
>>>>> }
>>>>> private class Inner2 { // visible to Outer & Inner(s)
>>>>> var c: Int // visible to Outer & Inner(s)
>>>>> }
>>>>> }
>>>>>
>>>>> extension Outer { // visible to module
>>>>> // 'a', 'b', and 'Inner2' NOT visible
>>>>> }
>>>>> ----------
>>>>> If this is the intended meaning of private, then fileprivate seems to
>>>>> be the same as private (private to the enclosing scope... which happens to
>>>>> be the file).
>>>>>
>>>>> Something declared "private" at the top level of a file is
>>>>> fileprivate. There would still need to be a way to reference scopes other
>>>>> than the immediate one (especially since there is no way to say "private"
>>>>> and mean moduleprivate), though I think it would strengthen the argument
>>>>> for something along the lines of "private(file)", since it would even
>>>>> further reduce the cases where you are spelling something more than just
>>>>> "private"
>>>>>
>>>>>
>>>>> On Mar 27, 2016, at 17:31, Haravikk via swift-evolution <
>>>>> swift-evolution at swift.org> wrote:
>>>>>
>>>>>
>>>>> On 27 Mar 2016, at 19:34, Jose Cheyo Jimenez via swift-evolution <
>>>>> swift-evolution at swift.org> wrote:
>>>>>
>>>>> Public
>>>>> External (default)
>>>>> Internal
>>>>> Private
>>>>>
>>>>>
>>>>> I still feel like these are still too vague; I’m not sure I like the
>>>>> use of external, as public to me is external since it exports outside of
>>>>> the module, whereas what you’re proposing is in fact just limited to the
>>>>> module itself. I dislike the current internal keyword too, but at least it
>>>>> reads as “internal to this module", this is why the more specific terms are
>>>>> better like:
>>>>>
>>>>> public as-is, item is public/exported outside of module
>>>>> private(module) or private current internal, item is private to this
>>>>> module, would be the default
>>>>> private(file) current private, item is private to this file
>>>>> private(scope) new visibility type, item is private to the current
>>>>> scope
>>>>>
>>>>> Assuming I’m understanding the restriction properly this time =)
>>>>>
>>>>> It’s also the easiest method if we do add another visibility later for
>>>>> sub-classes such as private(type), as it doesn’t even require a new keyword.
>>>>>
>>>>> _______________________________________________
>>>>>
>>>>>
>>>>> swift-evolution mailing list
>>>>> swift-evolution at swift.org
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>
>>>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160328/4732a122/attachment.html>
More information about the swift-evolution
mailing list