Comments in-line below.<br><br>On Thursday, 7 January 2016, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; Another option might be to allow imported definitions to be used by a<br>
&gt; conformance without the `override` marking to support retroactive modeling<br>
&gt; while requiring definitions in the same module as the conformance to<br>
&gt; explicitly specify the `override`.<br>
<br>
That&#39;s an interesting suggestion. I don&#39;t think I&#39;d prefer that<br>
solution, though, because I would imagine that it&#39;s during retroactive<br>
modeling of someone else&#39;s stuff that ambiguity regarding what&#39;s<br>
overridden or not might occur.<br>
<br>
I&#39;ve been slow in fully understanding Greg Parker&#39;s feedback, but on<br>
reflection it may be the only way to satisfy all use cases. In<br>
Thorsten&#39;s scenario where neither the protocol and its extension nor<br>
the type is under the control of the user, making the type conform to<br>
the protocol would either require no keyword requirements regarding<br>
overriding methods (as it is, and as you suggest) or else a syntax to<br>
indicate an overriding method must exist *within the extension that<br>
conforms a type to a protocol* (as Greg suggests).<br>
<br>
Can I propose an amended solution then?<br>
<br>
(1) When a protocol requires a method (or property getter/setter,<br>
etc.) but doesn&#39;t provide a default implementation, no keyword is used<br>
anywhere since all conforming types must provide their own<br>
implementation--I suppose a requirement could be made for a keyword,<br>
but I don&#39;t know that it adds much in terms of guarding against<br>
unintended behavior; I guess that can be a continued point of<br>
discussion</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></blockquote>I don&#39;t like this solution because the compiler produces poor error messages. It says that the type that implements the protocol doesn&#39;t conform to the protocol in all three cases described below. Whereas if override were required the compiler would say one of:<div><br></div><div>1. If the method was completely absent or there was a typo and no override the compiler could identify the missing method as an error on the type.</div><div>2. If the method had the same signature as a protocol method but no override (or had final) the compiler could say that override is required and importantly identify the method at fault</div><div>3. If the method had override but a typo the compiler could say that it does not override a method and importantly identify the method at fault.</div><div>4. If the method had both final and override the compiler could say that both not allowed and importantly identify the method at fault.<br><div><br></div><div>Which is much more fine grained and informative.<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
(2) When a protocol doesn&#39;t declare a method but an extension to the<br>
protocol provides one, types implementing a method with the same<br>
signature *must not* declare it to be overriding; such protocol<br>
extension methods are not overridden because they can be invoked after<br>
upcasting<br><br></blockquote>I would prefer final to be required so that it is clear that this is a static dispatch.<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
(3) When a protocol does declare a method, and an extension to the<br>
protocol provides a default implementation, then to override that<br>
implementation *either* the implementing type *or* an extension must<br>
use the keyword `override`<br><br>
(3a) In the case of an implementing type, `override func` is used<br>
instead of `func`, just as in the case of a class overriding a<br>
superclass method<br>
<br>
(3b) In the case of an extension to a type (this is the syntax I could<br>
come up with, but maybe it&#39;ll be objectionable in other ways), a<br>
method in an existing class can be retroactively made overriding by<br>
declaring `override [method signature]` with no body, similar to the<br>
way that a method is declared inside a protocol; by analogy, an<br>
overriding getter might use the syntax<br>
<br>
extension Int: BoundedType {<br>
    static var min { override get }<br>
}<br>
<br>
I think the syntax proposed in (3b) has the virtue of not requiring<br>
additional keywords, being sufficiently similar to (3a) so that it&#39;s<br>
not surprising, but still sufficiently unique in that the syntax is<br>
not currently valid code and thus isn&#39;t currently used to mean<br>
anything else.<br>
<br>
<br>
On Wed, Jan 6, 2016 at 8:21 AM, Matthew Johnson &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;matthew@anandabits.com&#39;)">matthew@anandabits.com</a>&gt; wrote:<br>
&gt;<br>
&gt; On Jan 6, 2016, at 3:48 AM, Greg Parker via swift-evolution<br>
&gt; &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Jan 5, 2016, at 8:50 PM, Brent Royal-Gordon via swift-evolution<br>
&gt; &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Taking inspiration from syntax used for methods in classes that override<br>
&gt; methods in superclasses, require methods that override dynamically<br>
&gt; dispatched default implementations in protocol extensions to use the<br>
&gt; override keyword. Likewise, forbid the override keyword if the method being<br>
&gt; implemented instead &#39;masks&#39; (would that be the right word?) a statically<br>
&gt; dispatched method in a protocol extension which can nonetheless be invoked<br>
&gt; by upcasting to the protocol.<br>
&gt;<br>
&gt;<br>
&gt; This has been suggested before, usually in the form of a separate<br>
&gt; `implement` keyword. The main problem is that it makes it impossible to<br>
&gt; write a protocol after the fact which formalizes some existing pattern in<br>
&gt; the types.<br>
&gt;<br>
&gt; What do I mean by that? Well, imagine you need generic access to the `min`<br>
&gt; and `max` static properties of the various integer types. There&#39;s no<br>
&gt; existing protocol that includes those members. But you can write one and<br>
&gt; then extend the integer types to conform to your new protocol:<br>
&gt;<br>
&gt; protocol BoundedIntegerType: IntegerType {<br>
&gt; static var min: Self { get }<br>
&gt; static var max: Self { get }<br>
&gt; }<br>
&gt; extension Int: BoundedType {}<br>
&gt; extension Int8: BoundedType {}<br>
&gt; extension Int16: BoundedType {}<br>
&gt; extension Int32: BoundedType {}<br>
&gt; extension Int64: BoundedType {}<br>
&gt;<br>
&gt; func printLowestPossibleValueOfValue&lt;Integer: BoundedIntegerType&gt;(x:<br>
&gt; Integer) {<br>
&gt; print(Integer.min)<br>
&gt; }<br>
&gt;<br>
&gt; This only works because `min` and `max` *don&#39;t* need any special marking to<br>
&gt; be used to satisfy a requirement. Requiring a keyword like you suggest would<br>
&gt; remove that feature.<br>
&gt;<br>
&gt;<br>
&gt; Possible solution: if you want a new protocol adoption to map to some<br>
&gt; existing method or property then you must explicitly write that. You can&#39;t<br>
&gt; just adopt the protocol in an empty extension.<br>
&gt;<br>
&gt;    extension Int: BoundedType {<br>
&gt;        static var min = Int.min<br>
&gt;        static var max = Int.max<br>
&gt;    }<br>
&gt;<br>
&gt; but with some other syntax that isn&#39;t ambiguous. Code completion and<br>
&gt; compiler fix-its could suggest this when the class already implements<br>
&gt; something suitable.<br>
&gt;<br>
&gt;<br>
&gt; Another option might be to allow imported definitions to be used by a<br>
&gt; conformance without the `override` marking to support retroactive modeling<br>
&gt; while requiring definitions in the same module as the conformance to<br>
&gt; explicitly specify the `override`.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Greg Parker     <a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;gparker@apple.com&#39;)">gparker@apple.com</a>     Runtime Wrangler<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt;<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div></div><br><br>-- <br>  -- Howard.<br><br>