<div dir="ltr"><div>Consider the following code</div><div><br></div><div>protocol MyProtocol {</div><div>    func doSomething()</div><div>}</div><div><br></div><div>extension MyProtocol {</div><div>    func doSomething() {</div><div>        print(&quot;default impl&quot;)</div><div>    }</div><div>}</div><div><br></div><div>class A: MyProtocol {}</div><div><br></div><div>class B: A {</div><div>    func doSomething() {</div><div>        print(&quot;B impl&quot;)</div><div>    }</div><div>}</div><div><br></div><div><div>let a: MyProtocol = A()</div><div>a.doSomething() // Prints &quot;default impl&quot;</div><div>let b: MyProtocol = B()</div><div>b.doSomething() // Prints &quot;default impl&quot; instead of &quot;B impl&quot;!</div></div><div><br></div><div>Now let&#39;s override doSomething in A...</div><div><br></div><div><div>class A: MyProtocol {</div><div>    func doSomething() {</div><div>        print(&quot;A impl&quot;)</div><div>    }</div><div>}</div><div><br></div><div>class B: A {</div><div>     override func doSomething() {</div><div>        print(&quot;B impl&quot;)</div><div>    }</div><div>}</div></div><div><br></div><div><div>let a: MyProtocol = A()</div><div>a.doSomething() // Now it prints &quot;A impl&quot;</div><div>let b: MyProtocol = B()</div><div>b.doSomething() // Now it prints &quot;B impl&quot;</div></div><div><br></div><div>That&#39;s clearly inconsistent. I would expect to print &quot;B impl&quot; in the first case; or maybe always &quot;default impl&quot; (I highly prefer the first option)</div></div>