I'd also say that one or two keywords are superior than the protocol naming 
approach in terms of implementation simplicity (for the core team).

My suggestions:

Either "conform" or "implement" should be a required keyword for all 
properties/functions which implement a protocol (also in protocol extensions)

"override" should be used if a default implementation or a member of a 
superclass is overridden.

If you are overriding a default implementation of a protocol "conform" / 
"implement" is also required.

// Retroactive conformance (old behavior) but only in extensions
extension Foo: @retroactive Baz {
    // only some members of Baz are implemented here (they need the keywords)
    // the other members outside the extension don't need any additional 
keywords
    // note: you can use "@retroactive" and "conform" in conjunction
}


Future directions:
"conform(ProtocolName)" / "override(ProtocolName)" can be used to disambiguate.

// reducing boilerplate
extension Foo: conform Bar {
    // These declarations can only implement Bar and don't need the "conform" 
keyword
}

Final question:
Should we also require a marker for implemented protocol members in the 
interface?:

protocol Foo {
    defaulted func foo()
}
extension Foo {
    implement func foo()
}


Best regards
Maximilian

>> Am 22.09.2016 um 16:44 schrieb Vladimir.S via swift-evolution 
>> <[email protected]>:
>> 
>> On 22.09.2016 11:10, Jean-Denis Muys via swift-evolution wrote:
>> I watched this thread with a lot of attention, starting neutral. You
>> must say that Karl won me over. His proposal would make Swift more
>> expressive, and less error prone in cases of protocol conformance with
>> name collisions. I am at this point +1
> 
> Actually I also support Karl's suggestion in general. It is trying to solve 
> IMO important problems and make Swift's protocol programming safer and less 
> fragile. Also it adds new interested features for working with protocols.
> 
> But in reality, I don't feel like his suggestion could be accepted by core 
> team and community and even if it could be supported, it seems for me that 
> *implementation* of his proposal requires a huge amount of time and big 
> changes in how Swift is working currently. (Probably some one who knows Swift 
> internals could comment regarding this)
> So, theoretically we'd have these improvements not in near future and I think 
> the problem discussed is very important to be addressed in Swift as soon as 
> possible.
> I base my opinion also on previous discussions regarding similar subjects.
> 
> My suggestion regarding a marker for protocol implementation method/prop in 
> type - solves most of the addressed problems with protocol conformance and 
> with fragile of such conformance, and adds one new keyword (or even zero - 
> right now I think the `override` is better choice for such "marker"). I 
> believe this proposal could be implemented with much less amount of work and 
> with less changes to current internals of Swift and to current code base, and 
> so we can have such a big improvement in Swift soon. So my intention was to 
> suggest solution that can dramatically improve Swift's protocol programming 
> with "small" amount of changes for compiler(internals) and for existed 
> sources.
> 
> But it seems like the direction chosen by the core team and supported by many 
> in community - is just a warning if extension conforming type to protocol 
> contains unrelated to that protocol methods/props. I see that this solution 
> can improve protocol programming in some areas, but does not address some IMO 
> important issues we discussed in the thread :
> 
> * Currently extension can not have stored properties. So, if we want to 
> implement protocol's props as stored properties - we can't move them to 
> extension. So to implement this soulution - we need stored properties in 
> extensions. It is not clear if and when they are expected.
> 
> * This solution will not require the safety(regarding protocol conformance) 
> from a developer, it will only inform and only if protocol conformance 
> defined in extension. So, when you use 3rd party source code - your project 
> will not be protected for the discussed problems.
> 
> * To write safe code I can't group methods/props as I want, I have to declare 
> a number of extensions per-protocol (in case my type conforms to a number of 
> protocols)
> 
> * This solution does not solve problem of near-miss signature of method 
> definition in protocol extension like here:
> protocol A { func foo() }
> protocol B : A {}
> extension A { func foo() }
> extension B { func voo() } // typo. how to "mark" this should be impl?
> "my" suggestion:
> extension A { override func foo() }
> extension B { override func foo() }
> 
> * Not clear how to write safe code with that approach if we implement 
> protocol requirement in derived class, but conformance was declared in base 
> (but not implemented) :
> protocol P { func foo() }
> extension P { func foo() }
> class A : P {}
> class B { func foo() } // we can't move this to extension, B already conforms 
> to P
> , and in opposite to "my" `override` requirement for implementation, if `A` 
> will add its own foo() implementation - we'll have to change B's 
> definition(need to add `override` for B.foo )
> "my" suggestion:
> class B { override func foo() }
> 
> 
>> 
>> Jean-Denis
>> 
>> Sent from my iPhone
>> 
>>> On 22 Sep 2016, at 07:15, Karl via swift-evolution
>>> <[email protected]> wrote:
>>> 
>>> I would like to make it a requirement if not inside a protocol
>>> extension which declares a conformance, and actually build the
>>> protocol name in to the member in an ABI-breaking way. We could make
>>> it additive by generating forwarding thunks from the old symbols to
>>> the new ones, but it would be better if we could just solve the
>>> overlapping-members problem before then.
>>> 
>>> That would mean you never get collisions between protocol members.
>>> There’s loads of amazing stuff we can do with that ability, and ways
>>> we can extend it to reduce a lot of boilerplate that occurs when you
>>> want to have multiple representations of the same data (String is just
>>> an example).
>>> 
>>> I don’t really care about the syntax we need to make it liveable. We
>>> could automatically insert the protocol names for unambiguous members
>>> at call-site, or something else.
>>> 
>>> This thread was originally about making the *syntax* a requirement; I
>>> agree with that, and I would actually take it one (or several) steps
>>> further, solving other problems along the way.
>>> 
>>>> On 22 Sep 2016, at 06:46, Russ Bishop <[email protected]> wrote:
>>>> 
>>>> 
>>>>> On Sep 20, 2016, at 4:34 PM, Dave Abrahams via swift-evolution
>>>>> <[email protected]> wrote:
>>>>> 
>>>>> 
>>>>>> on Tue Sep 20 2016, Karl <razielim-AT-gmail.com> wrote:
>>>>>> 
>>>>>> I think the best way is to prefix the member name with the
>>>>>> protocol, e.g:
>>>>>> 
>>>>>> protocol MyProto { var aVariable : Int func aFunction() } class
>>>>>> MyClass : MyProto { var MyProto.aVariable : Int func
>>>>>> MyProto.aFunction() { … } }
>>>>> ...
>>>>>> CC-ing Dave A, to understand better if this fits with the vision
>>>>>> of protocols
>>>>> 
>>>>> I generally agree with Doug.  The canonical way to indicate “this
>>>>> method/property/type implements a requirement of protocol P”
>>>>> should be to define the entity in an extension that also adds
>>>>> conformance to P. If that's inadequate indication in some way we
>>>>> should find a way to enhance it.  I wouldn't mind the notation
>>>>> above, but only as a fallback, not a reuquirement.
>>>>> 
>>>>> -- -Dave _______________________________________________
>>>> 
>>>> Indeed this is exactly how C# handles Interfaces (protocols). The
>>>> default is the exact same way Swift works - by matching names. If
>>>> there is a collision you specify Protocol.memberName. Its simple and
>>>> in the years I was writing C# code it was flexible enough to cover
>>>> most reasonable scenarios, without adding a bunch of boilerplate.
>>>> 
>>>> Russ
>>> 
>>> _______________________________________________ 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
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to