<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div name="messageBodySection" style="font-size: 14px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;">The example you presented – whilst utilizing a potential syntactical expression – seems like a step in the right direction. Specifically, I like the addition of a keyword as it introduces a more explicit invocation of the behavior.&#160;
<div><br /></div>
<div>Moreover, it does seem only natural to allow the re-mapping to occur for most (if not all) definitions between a protocol and the conforming type. I also agree that this feature would be a more advanced one, which does not need to be exposed for cases where this is not needed.&#160;</div>
<div><br /></div>
<div>I would also propose a slight adjustment to the syntax, albeit in a rugged form, to add the type annotation to the right hand side as well. E.g. remapped var P.f = S.g.&#160;</div>
<div><br /></div>
<div>If the above were to be respected, then the overall functionality of this could be expanded greatly, but it’d have to be seen how it would affect the implementation. To clarify, if we added the type annotation to the right side too, we may theoretically be able to change the type from the enclosing type to some arbitrary type and its conforming requirement. Now, if this seems a bit too polymorphic the compiler could just emit an error which restricts the type annotation to the enclosing type.</div>
<div><br /></div>
<div>Best,</div>
<div>David Moore</div>
</div>
<div name="messageReplySection" style="font-size: 14px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;"><br />
On Jul 5, 2017, 1:53 PM -0400, Chris Lattner &lt;clattner@nondot.org&gt;, wrote:<br />
<blockquote type="cite" style="margin: 5px 5px; padding-left: 10px; border-left: thin solid #1abc9c;"><br class="" />
<div>
<blockquote type="cite" class="" style="margin: 5px 5px; padding-left: 10px; border-left: thin solid #e67e22;">
<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. &#160;Swift’s underlying implementation model (for non-@objc protocols) does not require exact name matches and uniqueness. &#160;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. &#160;That said, it would be a power user feature only necessary in specific situations, and thus it makes sense to have super explicit syntax. &#160;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="">&#160; protocol P {</div>
<div class="">&#160; &#160; var x : Int</div>
<div class="">&#160; &#160; func f() -&gt; Int</div>
<div class="">&#160; }</div>
<div class=""><br class="" /></div>
<div class="">&#160; struct S : P {</div>
<div class="">&#160; &#160; var y : Int</div>
<div class="">&#160; &#160; remapped var P.x = y</div>
<div class=""><br class="" /></div>
<div class="">&#160; &#160; func g() -&gt; Int { return 42 }</div>
<div class="">
<div class="">&#160; &#160; remapped var P.f = g</div>
</div>
<div class="">&#160; }</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>
</blockquote>
</div>
</body>
</html>