<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 8, 2015 at 1:22 AM, Kevin Ballard <span dir="ltr">&lt;<a href="mailto:kevin@sb.org" target="_blank">kevin@sb.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><u></u>




<div><span class=""><div>On Mon, Dec 7, 2015, at 02:18 PM, ilya wrote:<br></div>
<blockquote type="cite"><div dir="ltr"><div><div><div> </div>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>
I wouldn&#39;t mind seeing something like the `dynamic` keyword to allow<br></div>
<div>
concrete types to override these protocol extension methods (although<br></div>
</blockquote><div> </div>
<div>You currently allow it by declaring method to be part of protocol, which means that an entry for some method is reserved in the protocol witness table. This entry will be filled either by concrete method, if present, or by protocol default implementation.<br></div>
</div>
</div>
</div>
</blockquote><div> </div>
</span><div>Sure, if you define the protocol yourself, and you want the method to be available for all instances of the protocol. My `dynamic` suggestion is meant to cover the cases of a) you didn&#39;t define the protocol yourself, but you want to define a method that can be overridden by any class that can see your protocol extension, or b) you want to define the method only for a subset of protocol implementations (e.g. with a `where` clause) but still want to allow for overriding.<br></div></div></blockquote><div><br></div><div>Interesting. I think your use case a) could work like this</div><div><br></div><div>protocol PP1 :P1 {</div><div>    func overrideable() -&gt; Int</div><div>}</div><div><br></div><div>extension P1 :PP1 { // doesn&#39;t currently compile with :PP1 inheritance clause</div><div>    func overrideable() -&gt; Int {</div><div>        return 1</div><div>    }</div><div>}</div><div><br></div><div>extension C1 {</div><div>    func overrideable() -&gt; Int {</div><div>        return 0</div><div>    }</div><div>}</div><div><br></div><div>(C1() as P1).overrideable() </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div></div>
<div> </div>
<div>That said, I think `dynamic` is the wrong keyword here, because it means runtime dynamic dispatch, and what I&#39;m really talking about is just the ability to have a separate protocol witness table for the extension.<span class=""><font color="#888888"><br></font></span></div><span class=""><font color="#888888">
<div> </div>
<div>-Kevin Ballard</div>
</font></span></div>

</blockquote></div><br></div></div>