If we really want to be overkill, we could use `required` for implementing an 
un-defaulted protocol requirement, `override` for implementing a defaulted 
protocol requirement, and `default` for implementing a protocol requirement in 
a protocol extension.

I think this might be more verbose than necessary, but I think it is at least 
worth exploring some subset of those keywords. They all reuse existing ones 
too, which is mostly a plus.

The biggest benefit I see from these is confidence that what you wrote 
satisfies your expectations. Just like `try` is required to document at the 
call-site that a method throws and like argument labels are required to 
document at the call-site the usage of each parameter, it's reasonable to 
require these keywords to document these expectations at the 
implementation-site. If you forget them, the compiler can easily remind you.

Requiring `override` and/or `required` would make it clear that you're actually 
implementing the protocol. It's too easily to make a typo and define a 
completely unrelated method. If the requirement is defaulted, you would never 
know until runtime weirdness. These keywords make protocol conformance less 
stringily typed.

I'm +1 on this idea in some form (but not necessarily what I suggested).

> On Aug 24, 2016, at 10:13 AM, Christopher Kornher via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Requiring "override" when anything overrides a method defined in a protocol 
> extension should be added - structure and enumerated included, of course.
> 
> Protocol extensions added inheritance to structs and enums and this should be 
> made explicit.
> 
> Sent from my iPad
> 
> On Aug 24, 2016, at 12:55 AM, Charles Srstka via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
>>> On Aug 24, 2016, at 1:20 AM, Robert Widmann <devteam.cod...@gmail.com 
>>> <mailto:devteam.cod...@gmail.com>> wrote:
>>> 2016/08/23 20:52、Charles Srstka <cocoa...@charlessoft.com 
>>> <mailto:cocoa...@charlessoft.com>> のメッセージ:
>>> 
>>>>> On Aug 23, 2016, at 10:34 PM, Robert Widmann <devteam.cod...@gmail.com 
>>>>> <mailto:devteam.cod...@gmail.com>> wrote:
>>>>> 
>>>>> 2016/08/23 15:29、Charles Srstka <cocoa...@charlessoft.com 
>>>>> <mailto:cocoa...@charlessoft.com>> のメッセージ:
>>>>> 
>>>>>>> On Aug 23, 2016, at 2:33 PM, Robert Widmann via swift-evolution 
>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>> 
>>>>>>> 2016/08/22 14:30、David Cordero via swift-evolution 
>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> のメッセージ:
>>>>>>> 
>>>>>>>> 
>>>>>>>> The problem:
>>>>>>>> At the moment, looking at the code of a class or a struct implementing 
>>>>>>>> a protocol, it is hard to know what methods are actually implementing 
>>>>>>>> the protocol and what other methods are just part of the code of the 
>>>>>>>> class or struct.
>>>>>>>> 
>>>>>>> 
>>>>>>> That seems like a feature, not a bug.  Why should I as an author care 
>>>>>>> whether a method contributes to a protocol conformance or not if the 
>>>>>>> compiler can tell me that kind of information itself?
>>>>>> 
>>>>>> Being able to reason about your code, what it does, and what it’s for is 
>>>>>> undesirable?
>>>>> 
>>>>> That's not an answer to the question I asked.  Why is this significant 
>>>>> enough to warrant an entire keyword?  The clutter of a whole keyword that 
>>>>> does nothing but wait for a developer to make a source-compatible 
>>>>> binary-breaking change to an interface does not seem worth it.  Maybe you 
>>>>> can convince me otherwise. 
>>>> 
>>>> Same reason overriding a class method warrants a keyword. It expresses the 
>>>> purpose more clearly, and allows the compiler to catch mistakes for us.
>>>> 
>>> 
>>> That's just it: The class of mistakes one can make by not being explicit 
>>> about overrides is significantly more dangerous than the class of mistakes 
>>> caused by dead code leftover from trimming protocols.
>> 
>> I am in the middle of a large refactor of code that was originally 
>> Objective-C and then Swift written like Objective-C, to more idiomatic 
>> protocol-oriented Swift. I am finding that in Swift’s POP idiom, protocols 
>> with overrides are serving very nearly the same purpose that overrides were 
>> serving in the old design; hence, I don’t really think either is more or 
>> less dangerous than the other.
>> 
>>>>>>>> ```
>>>>>>>> protocol MyProtocol {
>>>>>>>>     func myMethod() -> String
>>>>>>>> }
>>>>>>>> 
>>>>>>>> class MyClass: MyProtocol {
>>>>>>>> 
>>>>>>>>     conform func myMethod() -> String {
>>>>>>>>         return "Yuhuuu,I am conforming \\o// <smb://o//>"
>>>>>>>>     }
>>>>>>>> 
>>>>>>>>     func whatever() {
>>>>>>>>         print("I am a boring method and I don't conform anything")
>>>>>>>>     }
>>>>>>>> }
>>>>>>>> ```
>>>>>>>> 
>>>>>>>> It would be something similar to the current keyword `override` but 
>>>>>>>> for protocols. 
>>>>>>>> 
>>>>>>>> Apart from improving code readability, It would allow the detection, 
>>>>>>>> in compilation time, of errors due to code evolution. For example 
>>>>>>>> redundant methods that no longer conform anything once the requirement 
>>>>>>>> is removed from the protocol for whatever reason.
>>>>>>> 
>>>>>>> If you make a breaking change to a protocol like this, you should have 
>>>>>>> gone through a deprecation cycle to indicate to your clients the 
>>>>>>> appropriate changes you're going to make to the protocol.  This aspect 
>>>>>>> of the change seems to if not encourage, highlight, bad behavior.
>>>>>> 
>>>>>> What if it’s your own code and all the callers are internal? What if 
>>>>>> you’re still developing the protocol and haven’t released the API 
>>>>>> interface yet?
>>>>> 
>>>>> Then your concerns are local enough that you know where all 
>>>>> implementations of the protocol lie and whether they require deletion or 
>>>>> not.  The point about deprecation cycles still stands in all the cases 
>>>>> you mention.  Just because the interface is private doesn't mean you 
>>>>> can't take responsibility for keeping it as clean as you can.
>>>>> 
>>>>>> 
>>>>>> Charles
>>>>>> 
>>>>> 
>>>>> tl;dr It seems like all of this can be subsumed by us warning about dead 
>>>>> code.
>>>> 
>>>> Did you look at my examples earlier in the thread? Neither of those would 
>>>> be caught by warning about dead code.
>>> 
>>> The example involving the default implementation is most compelling, but it 
>>> indicates that your proposed solution should focus on the protocol 
>>> extension and not the implementing declaration.  Perhaps reusing one of our 
>>> existing keywords can help here
>>> 
>>> protocol P {
>>>   func foo() {}
>>> }
>>> 
>>> extension P {
>>>   default func foo() {}
>>> }
>>> 
>>> struct S: P {}
>>> 
>>> Of course, this change would be potentially source-breaking either way - I 
>>> don't like the sound of an "optional keyword”.  
>> 
>> I can come up with a similar example without the mistake being in the 
>> extension, though:
>> 
>> protocol P {
>>      func foo() {}
>> }
>> 
>> extension P {
>>      func foo() { print(“Default Behavior”) }
>> }
>> 
>> struct S: P {
>>      func foo() { print(“Specific Behavior”) }
>> }
>> 
>> So far, so good. But now I realize that the original protocol needs an 
>> argument:
>> 
>> protocol P {
>>      func foo(bar: String) {}
>> }
>> 
>> extension P {
>>      func foo(bar: String) { print(“Default Behavior; bar is \(bar)”) }
>> }
>> 
>> struct S: P {
>>      func foo() { print(“Specific Behavior”) } // Whoops, forgot to update 
>> this method, and now it won’t get called—and we of course won’t see the 
>> carnage until runtime.
>> }
>> 
>>> Either way, we can all agree we need better diagnostics around these cases.
>> 
>> No doubt.
>> 
>> Charles
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> 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