<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>Any thoughts on instead having to mark the default method implementations as `default`?<br></div>
<div>&nbsp;</div>
<div>It still seems strange to me to consider a protocol extension that uses the `final` keyword, because a) protocols have nothing to do with classes and `final` means no subclassing, and b) methods defined in protocol extensions by definition can't be overridden already, so the `final` keyword is just sort of like saying "no really, I mean it, you can't do the thing you already can't do!". But since I see the value in making it clear which methods are default implementations (and thus can be overridden), and which are actually just new methods, I'm in favor of using the `default` keyword on the former:<br></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">protocol Foo {</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">&nbsp; &nbsp; func foo() -&gt; String</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">}</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">extension Foo {</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">&nbsp; &nbsp; default func foo() -&gt; String { return "foo!" }</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">&nbsp; &nbsp; func bar() -&gt; String { return "bar" }</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;">}</span><span class="font" style="font-family: menlo, consolas, &quot;courier new&quot;, monospace, sans-serif;"><br></span></div>
<div>&nbsp;</div>
<div>-Kevin</div>
<div>&nbsp;</div>
<div>On Wed, Dec 9, 2015, at 09:37 AM, thorsten--- via swift-evolution wrote:<br></div>
<blockquote type="cite"><div>&nbsp;</div>
<div>This won't work if the protocol is provided by someone else (meaning I can't change its source code) and I want to provide a protocol extension in my own module.<br></div>
<div>&nbsp;</div>
<div>I like the original idea of having to mark extension methods not in the protocol definition as final. This would make the semantics much clearer.<br></div>
<div>&nbsp;</div>
<div>-Thorsten<br></div>
<div><div>&nbsp;</div>
<div>Am 09.12.2015 um 11:22 schrieb T.J. Usiyan via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br></div>
</div>
<blockquote type="cite"><div><div dir="ltr"><div>I actually suggest something along the lines of&nbsp;<br></div>
<div>&nbsp;</div>
<div><div><span class="size" style="font-size:13px">&nbsp; &nbsp; protocol Foo {</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; &nbsp; final func doIt() -&gt; String</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; }</span><br></div>
</div>
<div>&nbsp;</div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; extension Foo {</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; &nbsp; final func doIt() -&gt; String {</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("I did it.")</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; &nbsp; }</span><br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; &nbsp; final&nbsp;</span>func doThat() {<br></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("I did that.")<br></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }<br></div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; }</span><br></div>
<div>&nbsp;</div>
<div>to indicate that foo will be provided in this module and is not ever to be dynamically dispatched. This draws attention to the fact that dispatch is static in a clear consistent manner.<br></div>
<div>&nbsp;</div>
<div>TJ<br></div>
</div>
<div><div>&nbsp;</div>
<div><div>On Wed, Dec 9, 2015 at 1:31 PM, Gwendal Roué <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;</span> wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204, 204, 204);border-left-style:solid;padding-left:1ex;"><div><span><br>
&gt; Le 9 déc. 2015 à 06:31, Paul Cantrell &lt;<a href="mailto:cantrell@pobox.com">cantrell@pobox.com</a>&gt; a écrit :<br>
&gt;<br>
&gt; Gwendal Roué wrote:<br>
&gt;&gt; Whatever the direction this proposal is aiming at, please remember that it is desirable for some APIs to let adopting types "override" the default implementation provided by protocols.<br>
&gt;<br>
&gt;<br>
&gt; I would certainly hope nobody is proposing changing that! Once a method is virtually dispatched, it should be virtual all the way down to the implementing type.<br> <br></span>Yes, and it’s why I’m concerned. When a protocol provides a default implementation, how will an adopting type invoke that default implementation in its own implementation?</div>
<div>&nbsp;</div>
<div>
With classes, it’s easy: you call super.<br></div>
<div>&nbsp;</div>
<div>
With protocols, it’s much less easy, if possible at all, as soon as all methods are dynamically dispatched.<br></div>
<div><div><div>&nbsp;</div>
<div>
Gwendal Roué<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>
_______________________________________________<br></div>
<div>
swift-evolution mailing list<br></div>
<div> <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</div>
</div>
</blockquote></div>
</div>
<div><img style="height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-bottom:0px !important;margin-right:0px !important;margin-left:0px !important;padding-top:0px !important;padding-bottom:0px !important;padding-right:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/bd6e7889293bf4b88b6ee781be24726824a9e088a03c82bb00062d1efdb597ad/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3a503c666540314672425b47535441436c6470553d223647714634784733447a517a6247763b4154687a786835556541457d4543505e636973547f61694f4737784d2232475442664d22324575426944457f41737e644d22364154545d22324e4d6376387338696364416439325d465a566452427530324669566a4951405532435a7333785274477b495a7d6866466353525531673c414155644a556732786b4b65655140724d22324c437272315a4b44503a5a443b65533846527434735842715857626c454f48746175727376436762507d476e464734757a7b43786d22364433643970575e48473160313c4a6a467072765d6237316e466d2236403d22324a7a6256507b636b6773555d634166723b414/open"><br></div>
</div>
</blockquote><blockquote type="cite"><div><div><span>_______________________________________________</span><br></div>
<div><span>swift-evolution mailing list</span><br></div>
<div><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br></div>
<div><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div>
</div>
</blockquote><div><img style="height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-bottom:0px !important;margin-right:0px !important;margin-left:0px !important;padding-top:0px !important;padding-bottom:0px !important;padding-right:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/d275712189d07980ac4df52e5888ec00b408f376b84959fb58faffa33c4952ff/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3148765176786c673171614a7d2236454230345272776e415034495a47476b425058325d22364368737671316447314861433f6d22324d4a5754577644586032596552363e4b626f48457e6838416d2232416565367a69574277574055424742785232354237334652355659695f4d6977367c62783d644664495a63476e6c6665595d497250745d22364f4532454466386131435942414f483a79377b4c6a566266654b446a445e64675275465038715270725178614f6d2236434a7f6b4d45796d223240737d664e674339785572416071674039727a42435d4a6350333563797274476d23344d23344/open"><br></div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div>&nbsp;</div>
</body>
</html>