<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 Jun 27, 2017, at 2:26 PM, David Moore via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline">Onto Option #2, the idea of using base types to express more explicit definitions to solve the initial problem. When it comes to using a base type to correctly disambiguate these types of situations, it may be familiar to some who like a more concrete implementation, although it eliminates possible convenience, but still requires knowledge. Options #2 would look something like the following.</div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">protocol Foo {</div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""> associatedtype ABC<br class=""></div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">}</div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">struct Bar&lt;ABC&gt;: Foo {</div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""> typealias Foo.ABC = Bar.ABC // Quite explicit and communicates the solution clearly.<br class=""></div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">}</div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Options #2, as you can see above, would also be source compatible because it would not impose on already defined typealias’ or other implementations. This could be an opt-in feature. However, I don’t know if it is as nice as just pure inference, which doesn’t seem too much more difficult than this would be, but I’m not sure about that.</div><br class="Apple-interchange-newline"></div></blockquote></div><br class=""><div class="">Something like this seems like the right approach to me. &nbsp;Swift’s underlying implementation model (for non-@objc protocols) does not require exact name matches and uniqueness. &nbsp;This means that (from an implementation perspective) it would be possible to allow “remapping” of requirements to implementations, even if they have different (or conflicting) names.</div><div class=""><br class=""></div><div class="">This can be useful in some cases, like the one you give above. &nbsp;That said, it would be a power user feature only necessary in specific situations, and thus it makes sense to have super explicit syntax. &nbsp;Given that remapping can apply to any requirement (be it a type, method, property, subscript, …) it may make sense to make it an explicit decl modifier like:</div><div class=""><br class=""></div><div class="">&nbsp; protocol P {</div><div class="">&nbsp; &nbsp; var x : Int</div><div class="">&nbsp; &nbsp; func f() -&gt; Int</div><div class="">&nbsp; }</div><div class=""><br class=""></div><div class="">&nbsp; struct S : P {</div><div class="">&nbsp; &nbsp; var y : Int</div><div class="">&nbsp; &nbsp; remapped var P.x = y</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp; func g() -&gt; Int { return 42 }</div><div class=""><div class="">&nbsp; &nbsp; remapped var P.f = g</div></div><div class="">&nbsp; }</div><div class=""><br class=""></div><div class="">or something.</div><div class=""><br class=""></div><div class="">-Chris</div><div class=""><br class=""></div></body></html>