<div dir="ltr"><div>Hello Jeremy,<br><br></div>It seems it is a little bit more complex than this: <a href="http://allblue.me/swift/2016/01/23/swift-method-dispatch-with-protocol-extension-protocol-extension-and-subclass/">http://allblue.me/swift/2016/01/23/swift-method-dispatch-with-protocol-extension-protocol-extension-and-subclass/</a><br><img src="http://allblue.me/media/swift_method_dispatch.jpg" alt="diagram"><br><ul><li>IF the inferred type of a variable is the protocol:

<ul><li>IF the method is in a class conform directly to the original protocol:

<ul><li>AND the method is defined in the original protocol

<ul><li>THEN the runtime type’s implementation is called, irrespective of whether   there is a default implementation in the extension.</li></ul></li><li>AND the method is not defined in the original protocol,

<ul><li>THEN the default implementation is called.</li></ul></li></ul></li><li>ELSE IF the method is in a subclass of another class who conform to the original protocol

<ul><li>THEN the default implementation of protocol is called.</li></ul></li></ul></li><li>ELSE IF the inferred type of the variable is the type

<ul><li>THEN the type’s implementation is called.</li></ul></li></ul><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 19, 2016 at 5:24 PM, Jeremy Pereira via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On 19 May 2016, at 13:30, Krystof Vasa via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; See this example that demonstrates how it&#39;s pretty much unusable (IMHO), since whenever you refer to the instance as to the protocol, the default implementation gets invoked:<br>
&gt;<br>
&gt; protocol MyProtocol { }<br>
&gt;<br>
&gt; extension MyProtocol {<br>
&gt;       func getInt() -&gt; Int {<br>
&gt;               return 0<br>
&gt;       }<br>
&gt; }<br>
&gt;<br>
&gt; class MyClass: MyProtocol {<br>
&gt;       func getInt() -&gt; Int {<br>
&gt;               return 1<br>
&gt;       }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; let instance = MyClass()<br>
&gt; instance.getInt() // 1<br>
&gt;<br>
&gt; var anyInstance: MyProtocol = instance<br>
&gt; anyInstance.getInt() // 0 !!!!!!!<br>
&gt;<br>
&gt;<br>
&gt; Since anyInstance is of MyProtocol type, you get the default implementation (no dynamic dispatch).<br>
<br>
<br>
</span>That’s because the only information that the compiler has about anyInstance is that it conforms to MyProtocol which has no methods so it doesn’t know that it can dispatch getInt() to the implementation in MyClass. Change the protocol to<br>
<br>
protocol MyProtocol {<br>
    func getInt() -&gt; Int<br>
}<br>
<br>
and it will work as expected.<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div>