<div dir="ltr">Hey, what annotations would I have in this case:<br><br>Module 1:<div class="" style="margin-bottom:16px;background-color:transparent;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:14px;overflow:visible!important"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:12px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal"><span class="" style="color:rgb(167,29,93)">Type</span> AType { <span class="" style="color:rgb(167,29,93)">func</span> <span class="" style="color:rgb(121,93,163)">foo</span>() { <span class="" style="color:rgb(167,29,93)">...</span> } }</pre></div>Module 2:<div class="" style="background-color:transparent;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:14px;margin-bottom:0px!important;overflow:visible!important"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:12px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal"><span class="" style="color:rgb(167,29,93)">import</span> <span class="" style="color:rgb(0,134,179)">Module1</span>
<span class="" style="color:rgb(167,29,93)">protocol</span> A { <span class="" style="color:rgb(167,29,93)">func</span> <span class="" style="color:rgb(121,93,163)">foo</span>() {<span class="" style="color:rgb(167,29,93)">...</span><span class="" style="color:rgb(167,29,93)">default</span><span class="" style="color:rgb(167,29,93)">...</span>} }
<span class="" style="color:rgb(167,29,93)">extension</span> AType: A {}</pre></div><div class="gmail_extra"><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div>Also, for your <b>alternatives</b> section:<div class="gmail_quote"><br></div><div class="gmail_quote"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:12px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;color:rgb(51,51,51)"><span class="" style="color:rgb(167,29,93)">protocol</span> A { <span class="" style="color:rgb(167,29,93)">func</span> <span class="" style="color:rgb(121,93,163)">foo</span>() {<span class="" style="color:rgb(167,29,93)">...</span><span class="" style="color:rgb(167,29,93)">default</span><span class="" style="color:rgb(167,29,93)">...</span>} }
<span class="" style="color:rgb(167,29,93)">Type</span> AType: A {
    <span class="" style="color:rgb(167,29,93)">func</span> A<span class="" style="color:rgb(167,29,93)">.</span>foo() {<span class="" style="color:rgb(167,29,93)">...</span>replacement<span class="" style="color:rgb(167,29,93)">...</span>}
}</pre></div><div class="gmail_quote"><br></div><div class="gmail_quote">I actually prefer this alternative, I think it fixes many issues.</div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote">On Thu, Apr 28, 2016 at 12:47 PM, Erica Sadun 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Apr 27, 2016, at 6:03 PM, Douglas Gregor &lt;<a href="mailto:dgregor@apple.com" target="_blank">dgregor@apple.com</a>&gt; wrote:</div><div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div style="word-wrap:break-word"><div><div>2) Is “override” only required when there is a default implementation of the protocol requirement, or is it required whenever you are implementing a protocol requirement?</div></div></div></blockquote><div><br></div><div>Override is only because it is overriding the default implementation of the protocol requirement. Without that default implementation there would be no override, it would simply be satisfying the requirement.</div></div></div></div></blockquote><div><br></div><div>For me, this doesn’t provide additional value of “required”: i.e., the value of having a keyword here is in telling me that I failed to implement a requirement when I’ve clearly said that I wanted to implement a requirement. Whether there was a default there or not isn’t really very interesting. Plus, a default could be added later to a requirement that I implement: that change has zero impact on how my code works (before or after), but now I’d be require to add an “override” keyword when I recompile.</div><div><br></div><div>Contrast that with classes: if you recompile against a new version of a library and the compiler tells you that you need to add “override”, it’s serious because the semantics of your program will change if you’re now overriding something that you weren’t before.</div></div></div></blockquote><div><br></div></span>Consider these situations:</div><div><br></div><div>* I use the word &#39;required&#39; but I use a Double in the signature instead of a Float. Compiler detects. Instant alert on the mismatch.</div><div>* I implement a required member but fail to use the word required. Compiler detects. Instant alert: this is a required member, did you intend to use this signature for that purpose?</div><div>* I implement a required member. I then later provide a default. Compiler detects. &quot;This version will be overridden by the default version the protocol and/or extension. Either remove this implementation or add the override keyword to prefer it to the default version.&quot;</div><div>* I implement a default version and then later implement the required member. Compiler detects Same warning as above. </div><div><br></div><div><br></div><div><span class=""><blockquote type="cite"><div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><br><blockquote type="cite"><div style="word-wrap:break-word"><div><div><span style="white-space:pre-wrap">        </span>* If the former, it might be the case that it’s too easy to forget to add the “override” keyword (because it’s needed for some implementations of protocol requirements but not others), which undercuts the value of having it.</div></div></div></blockquote><div><br></div><div>Forcing the override keyword makes it clear at the definition point that the story extends beyond the method or whatever to point to a default implementation that is being replaced. I *really* like having that reference in terms of both code construction (“I am doing this as a deliberate act”) with the compiler complaining otherwise, and in terms of code self documentation (“I know this was added deliberately, what default did it override?”)</div></div></div></div></blockquote><div><br></div><div>I see the former (“I am doing this as a deliberate act”)  as a very common complaint; the latter not nearly as much. What motivates that? And does it justify adding a *second* keyword to these declarations?</div></div></div></blockquote><div><br></div></span><div>I think I caught the gist in the situations above. If not, will respond further.</div><span class=""><br><blockquote type="cite"><div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div style="word-wrap:break-word"><div>I’d also like to bring up two related topics, although they probably should at some point move to their own thread if they have any legs:<br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><br></div><div>Related topic 1: How should a consumer handle a situation where two unrelated protocols both require the same member and offer different default implementations. Can they specify which implementation to accept or somehow run both? </div><div><br></div><div>type B: A, C {</div><div>    override required func foo() { A.foo(); C.foo() }</div><div>}</div></div></div></blockquote><div><br></div><div>I think the right answer here is for the compiler to produce an ambiguity if you don’t implement the requirement yourself, and then solving your “related topic 2” lets you choose which implementation you want.</div></div></div></blockquote><div><br></div><div>How do you choose which one? What syntax? For example:</div><div><br></div><div>required func foo = A.foo</div><div><br></div><div>would be the simplest approach</div></div></div></div></blockquote><div><br></div>type B: A, C {</div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">  override required func foo() { A.foo(self)() }</div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">}</div></div></blockquote><div><br></div></span>+1</div><div><br></div><div><span class=""><blockquote type="cite"><div><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div style="word-wrap:break-word"><div><blockquote type="cite"><div><div style="word-wrap:break-word"><div>Related topic 2: How can a consumer “inherit” the behavior of the default implementation (like calling super.foo() in classes) and then extend that behavior further. This is a bit similar to how the initialization chaining works. I’d like to be able to call A.foo() and then add custom follow-on behavior rather than entirely replacing the behavior.</div><div><br></div><div>type B: A {</div><div>    override required func foo() { A.foo(); … my custom behavior … }</div><div>}</div></div></div></blockquote><div><br></div><div>Seems totally reasonable to me. One ugly syntax: A.foo(self)(), leveraging the currying of self?</div></div></div></blockquote><div><br></div><div>Ugly but it would pretty much do it for me. It offers an expressive way to say “Please execute the A.foo behavior using the self instance”. Does 3 still support this?</div></div></div></div></blockquote></div><br style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div style="font-family:Palatino-Roman;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Probably not? I actually don’t know ;)</div></div></blockquote><div><br></div></span><div>I vaguely remember some stuff being changed. I&#39;d normally try to test but I can&#39;t get a dev build to work in Xcode since the March 24 build. :(</div><span class=""><font color="#888888"><div><br></div><div>-- E</div></font></span></div></div><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>
<br></blockquote></div><br></div></div>