<div dir="ltr"><div>On Tue, Dec 22, 2015 at 10:18 PM, Joe Groff &lt;<a href="mailto:jgroff@apple.com">jgroff@apple.com</a>&gt; wrote:</div><div><br></div><div>&gt; What you&#39;re proposing is closer to the other approach I laid out, allowing protocol types to be</div><div>&gt; extended to conform to protocols themselves</div><div><br></div><div>I couldn&#39;t find the thread you&#39;ve explained this earlier, so I&#39;m going by what you&#39;ve described in this thread.</div><div><br></div><div>&gt; extension protocol&lt;R&gt;: P { // We&#39;re extending the protocol *type* to conform, not its conformers</div><div>&gt;   func f1(t: R) { }</div><div>&gt; }</div><div><br></div><div>But we *do* want conformers of R to also conform to P (and have func f1&#39;s implementation available in them, by virtue of conforming to R). If we didn&#39;t, then if we apply this solution to the Swift stdlib, and we have the following type hierarchy when we use it (considering the example from <a href="http://inessential.com/2015/08/05/swift_diary_9_where_im_stuck">http://inessential.com/2015/08/05/swift_diary_9_where_im_stuck</a>):</div><div><br></div><div>protocol Equatable (in stdlib)</div><div> -&gt; protocol Hashable (in stdlib)</div><div> -&gt; protocol Account (in app)</div><div>     with a protocol extension:</div><div>     extension protocol&lt;Account&gt; : Equatable {</div><div>         func isEqual(lhs: Account, rhs: Account) -&gt; Bool { return false }</div><div>     }</div><div> -&gt; class TwitterAccount (in app)</div><div><br></div><div>If I understand your solution correctly, the above setup means that the Account protocol and the TwitterAccount class don&#39;t conform to Equatable - only that the Account existential type conforms to Equatable. So we can&#39;t do twitterUser1 == twitterUser2, and being able to do that is desirable for this use case.</div><div><br></div><div>What I was proposing can be seen as a variation of your EquatesWith approach, the difference being that the &quot;where EquatesWith == Drawable&quot; part is automatically inferred by the compiler based on where the super-protocol gets implemented in the type hierarchy. It could be implemented in a class/struct, in which case `Subtype` would behave similar to `Self`, or it could be implemented in a protocol, in which `Subtype` would bind to the protocol (like, say, `Drawable`).</div><div><br></div><div>roop.</div></div>