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> wrote:
> 
>> On Aug 24, 2016, at 1:20 AM, Robert Widmann <devteam.cod...@gmail.com> wrote:
>> 2016/08/23 20:52、Charles Srstka <cocoa...@charlessoft.com> のメッセージ:
>> 
>>>> On Aug 23, 2016, at 10:34 PM, Robert Widmann <devteam.cod...@gmail.com> 
>>>> wrote:
>>>> 
>>>> 2016/08/23 15:29、Charles Srstka <cocoa...@charlessoft.com> のメッセージ:
>>>> 
>>>>>> On Aug 23, 2016, at 2:33 PM, Robert Widmann via swift-evolution 
>>>>>> <swift-evolution@swift.org> wrote:
>>>>>> 
>>>>>> 2016/08/22 14:30、David Cordero via swift-evolution 
>>>>>> <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//"
>>>>>>>     }
>>>>>>> 
>>>>>>>     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
> 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