<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 14, 2015, at 7:47 AM, Paul Cantrell &lt;<a href="mailto:cantrell@pobox.com" class="">cantrell@pobox.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><blockquote type="cite" class="">On Dec 14, 2015, at 1:37 AM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com" class="">dabrahams@apple.com</a>&gt; wrote:</blockquote><blockquote type="cite" class=""><br class=""></blockquote><blockquote type="cite" class=""><div class=""><blockquote type="cite" class="" style="font-family: HelveticaNeue;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="">func maxY(p1: P, p2: P) -&gt; Int {</div><div class="">&nbsp; return max(p1.y, p2.y) &nbsp; // No problems here!</div><div class="">}</div></div><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><br class=""></div><div class="">…right?</div></div></div></div></div></div></blockquote><br class="" style="font-family: HelveticaNeue;"></div><div class=""><div class="">Ah, but then you have the situation that P doesn't conform to P (it doesn't have an x that you can access). &nbsp;In my opinion that is just too weird an idea to be usable.</div><div class="">Personally, I have always thought that protocols intended to be used as unbound existentials (not P&lt;A: Int&gt;, just plain P) are different beasts entirely from the kind used as generic constraints and should be explicitly declared as such—I don't think I've ever seen a protocol that is well-used in both ways; if you have counterexamples I'd love to see them. &nbsp;In "existential protocols," declaring an associated type or creating a self requirement would be an error at the point of declaration. &nbsp;</div></div></blockquote><div class=""><br class=""></div><div class="">IMHO, it’s an artificial distinction that makes sense only if you’re acclimated to Swift’s current behavior.</div><div class=""><br class=""></div><div class="">There are plenty of situations where you really do want a generic type in the protocol, but you nonetheless find yourself in situations where you care only about the parts of the protocol that don’t depend on that generic type.</div><div class=""><br class=""></div><div class="">Here’s an example, pared down a lot but taken from an actual project:</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp;&nbsp;<span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">protocol</span> Request</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">typealias</span> ContentType</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo; min-height: 12px;" class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(50, 62, 125);" class="">func</span>&nbsp;onCompletion(callback:&nbsp;(<span style="color: rgb(88, 126, 168);" class="">ContentType?, ErrorType?)</span>&nbsp;-&gt;&nbsp;<span style="color: rgb(88, 126, 168);" class="">Void</span>)</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span> onSuccess(callback: <span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">ContentType</span> -&gt; <span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Void</span>)</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(50, 62, 125);" class="">func</span>&nbsp;onNewData(callback:&nbsp;<span style="color: rgb(88, 126, 168);" class="">ContentType</span>&nbsp;-&gt;&nbsp;<span style="color: rgb(88, 126, 168);" class="">Void</span>)</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo; min-height: 12px;" class=""><span style="font-size: 10.5px;" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="font-size: 10.5px; color: rgb(50, 62, 125);" class="">func</span><span style="font-size: 10.5px;" class=""> onFailure(callback: </span><span style="font-size: 10.5px; color: rgb(88, 126, 168);" class="">ErrorType</span><span style="font-size: 10.5px;" class=""> -&gt; </span><span style="font-size: 10.5px; color: rgb(88, 126, 168);" class="">Void</span><span style="font-size: 10.5px;" class="">)</span></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo; min-height: 12px;" class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span> cancel()</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo; min-height: 12px;" class=""><br class=""></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">struct</span> RequestBatch</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">var</span> requests: [<span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Request</span>] &nbsp;<font color="#901000" class="">// Sadness. Despair. DOOOOM.</font></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo; min-height: 12px;" class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span> cancelAll()</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">for</span> request <span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">in</span> <span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">requests</span></div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { request.<span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">cancel</span>() }</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 10.5px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div></div><div class=""><br class=""></div><div class="">The current Swift solution is either to ditch the type safety of ContentType, or split Request into two protocols. The latter makes the API hard to read, and may decouple related protocol requirements that don’t make sense independently.</div></div></div></blockquote><br class=""></div><div>IMO the fact that you created an a array of requests and wrote cancelAll above *demonstrates* that the cancel requirement makes sense independently from the others.</div><div><br class=""></div><div class="">
-Dave<div class=""><br class=""></div><br class="Apple-interchange-newline">

</div>
<br class=""></body></html>