<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("default impl")</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("B impl")</div><div> }</div><div>}</div><div><br></div><div><div>let a: MyProtocol = A()</div><div>a.doSomething() // Prints "default impl"</div><div>let b: MyProtocol = B()</div><div>b.doSomething() // Prints "default impl" instead of "B impl"!</div></div><div><br></div><div>Now let's override doSomething in A...</div><div><br></div><div><div>class A: MyProtocol {</div><div> func doSomething() {</div><div> print("A impl")</div><div> }</div><div>}</div><div><br></div><div>class B: A {</div><div> override func doSomething() {</div><div> print("B impl")</div><div> }</div><div>}</div></div><div><br></div><div><div>let a: MyProtocol = A()</div><div>a.doSomething() // Now it prints "A impl"</div><div>let b: MyProtocol = B()</div><div>b.doSomething() // Now it prints "B impl"</div></div><div><br></div><div>That's clearly inconsistent. I would expect to print "B impl" in the first case; or maybe always "default impl" (I highly prefer the first option)</div></div>