I think you can simplify this proposal by just saying something like this and
give a couple of examples that are easy to follow:
Disallow explicit public access modifier on non-protocol-conforming type
extensions.
I think if you only focus on that breaking change then the proposal will have a
good chance of getting accepted and fixing the immediate issue of public. There
is a reason why protocol conforming extensions do not allow explicitly saying
public
`public extension Type: Protocol {}` // public not allowed
In essence we will be asking for the same behavior for types.
Allowing methods declared inside extensions to have a higher declared
visibility is not a breaking change and can be introduced later.
Nobody wants private extensions or implicit internal extensions to go away. :)
> On Jul 16, 2016, at 4:22 PM, Xiaodi Wu via swift-evolution
> <[email protected]> wrote:
>
>> On Sat, Jul 16, 2016 at 6:10 PM, David Hart <[email protected]> wrote:
>> This proposal really confuses me. Two comments:
>>
>> 1) With the proposal, we loose the ability to use access modifiers on
>> extensions as a way of grouping members by access. That's a huge loss for me.
>
> You lose the ability to group public members only. That part is intentional,
> so that only methods declared with `public func` are public.
>
>> 2) If we adopt the proposal, I now have no idea what explicit access
>> modifiers on extensions do.
>
> I propose keeping explicit access modifiers because previous comments on this
> list have said that it's useful for grouping members by access. You can
> continue to use extensions to group fileprivate members of an internal type,
> or internal members of a public type.
>
>
>> More generally, I don't understand this proposal as it's trying to apply the
>> same access modifier rules on extensions as for types but extensions are not
>> types. They are just a declaration for extending types which already have an
>> access level.
>>
>>> On 16 Jul 2016, at 20:04, Xiaodi Wu via swift-evolution
>>> <[email protected]> wrote:
>>>
>>> With the impending withdrawal of SE-0119 and the closing window for (most)
>>> source-breaking changes, I thought I'd draft up a proposal to address some
>>> of the key points raised in that discussion.
>>>
>>> The proposed changes are deliberately limited in scope to rationalizing
>>> access modifier rules without adding any new facilities (such as
>>> conformances of lower visibility than the type), which might be more
>>> appropriate for the Swift 4 timeline.
>>>
>>> I hope this will prove satisfactory to the community :)
>>>
>>>
>>> Harmonize access modifiers for extensions
>>>
>>> Proposal: SE-XXXX
>>> Author: Xiaodi Wu
>>> Status: Awaiting review
>>> Review manager: TBD
>>> Introduction
>>>
>>> During discussion of SE-0119, the community articulated the view that
>>> access modifiers for extensions were and should continue to be subject to
>>> the same rules as access modifiers for types. Unfortunately, it is not
>>> factually true today; this proposal aims to make it so.
>>>
>>> Swift-evolution threads:
>>>
>>> [Proposal] Revising access modifiers on extensions
>>> [More to be added here]
>>> Motivation
>>>
>>> Consider the following:
>>>
>>> public struct foo {
>>> func frobnicate() { } // implicitly internal
>>> }
>>> public extension foo { }
>>>
>>> public struct bar { }
>>> public extension bar {
>>> func frobnicate() { } // implicitly public, according to SE-0025
>>> }
>>> According to SE-0025, a method moved from the body of a public struct into
>>> a public extension becomes public without modification. This is surprising
>>> behavior contrary to Swift's general rule of not exposing public API by
>>> default.
>>>
>>> Furthermore, SE-0025 now permits the owner of a type to design access for
>>> members as though the type will have a higher access level than it
>>> currently does. For example, users will be able to design public methods
>>> inside an internaltype before "flipping the switch" and making that type
>>> public. The same approach is prohibited by SE-0025 for extensions, although
>>> conceptually it need not be.
>>>
>>> Proposed solution
>>>
>>> The proposed solution is to change access modifier rules for extensions
>>> with the following effect: if any method (or computed property) declared
>>> within the body of a type at file scope is moved without modification into
>>> the body of an extension in the same file, the move will not change its
>>> accessibility.
>>>
>>> In code:
>>>
>>> struct foo {
>>> // Any method declared here...
>>> }
>>> extension foo {
>>> // ...should have the same visibility when moved here.
>>> }
>>> This implies that public API commitments will need to be annotated as
>>> public at declaration sites inside an extension just as it must be at
>>> declaration sites inside types.
>>>
>>> Detailed design
>>>
>>> Declarations inside the extension will, like declarations inside types,
>>> have a default access level of internal.
>>> The compiler should not warn when a broader level of access control is used
>>> for a method (or computed property, etc.) declared within an extension with
>>> more restrictive access. This allows the owner of the extension to design
>>> the access level they would use for a method if the type or extension were
>>> to be made more widely accessible.
>>> An extension declared without an explicit access modifier will have the
>>> same access level as the type being extended.
>>> An extension declared without protocol conformance may optionally use an
>>> explicit access modifier to provide an upper bound for the visibility of
>>> its members.
>>> Alternatives considered
>>>
>>> One alternative, still open for consideration, is to eliminate #4 and
>>> disallow explicit access modifiers on extensions. As an advantage, this
>>> would clarify the mental model that extensions are not their own entities,
>>> as they cannot be referred to by name and have no runtime representation.
>>> As a disadvantage, extensions cease to be an access modifier grouping
>>> construct, which some users really like.
>>> Acknowledgments
>>>
>>> Thanks to all discussants on the list, especially Adrian Zubarev and Jose
>>> Cheyo Jimenez.
>>>
>>> _______________________________________________
>>> 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
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution