<div dir="ltr">Good point. <div><br></div><div>Protocol is a contract, it is natural to allow same item in multiple protocol and eventually pointing to one single implementation.  </div><div><br></div><div>By giving warning simply for same name, it will be quite annoying when the project run into this situation without any wrong. For example:</div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)"><br></span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">protocol</span> ForwardIndexType : <span style="color:rgb(112,61,170)">_Incrementable</span> {</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> advancedBy(n: <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112,61,170)"><span style="color:rgb(187,44,162)">extension</span><span style="color:rgb(0,0,0)"> </span>ForwardIndexType<span style="color:rgb(0,0,0)"> {</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> advancedBy(n: <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> advancedBy(n: <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span>, limit: <span style="color:rgb(112,61,170)">Self</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> distanceTo(end: <span style="color:rgb(112,61,170)">Self</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">






</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)"><br></span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">protocol</span> BidirectionalIndexType : <span style="color:rgb(112,61,170)">ForwardIndexType</span></p></div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112,61,170)"><span style="color:rgb(187,44,162)">extension</span><span style="color:rgb(0,0,0)"> </span>BidirectionalIndexType<span style="color:rgb(0,0,0)"> {</span><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> advancedBy(n: <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">    </span>@warn_unused_result</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">public</span> <span style="color:rgb(187,44,162)">func</span> advancedBy(n: <span style="color:rgb(112,61,170)">Self</span>.<span style="color:rgb(112,61,170)">Distance</span>, limit: <span style="color:rgb(112,61,170)">Self</span>) -&gt; <span style="color:rgb(112,61,170)">Self</span></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112,61,170)">




</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">If a type conforms BidirectionalIndexType, it gets all these advancedBy(). OK, for this specific case we may workaround by assuming safe for those inherited. Which means we only warn for same name item from protocols in different protocol hierarchy without common root.</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">It is still doubtful even for this filtered case, because compiler cannot tell it appears by intention or by mistake. We have to suppress it for acceptable cases, that&#39;s annoying as protocol should allow it naturally.</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">There is a case good for throwing error: receiving item with same name but different type from two protocols, but it is already an error now.</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></p></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 9, 2016 at 11:47 AM, Wallacy 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Storage properties on protocol or in extension plus something when call maybe a solution:<div><br></div><div><div>       protocol Marriageable {</div><div>               var foo:Int = 0; // actual a var.</div><div>                var ring: String? // actual a var.</div><div>        }</div><div>        protocol CallReceivable {</div><div>                var ring: String? // actual a var.</div><div>        }</div><div><br></div><div>        struct Person: Marriageable, CallReceivable { }</div></div><div><br></div><div>OR</div><div><span class=""><span style="font-size:13px;line-height:19.5px">        protocol Marriageable {</span><br style="font-size:13px;line-height:19.5px"><span style="font-size:13px;line-height:19.5px">                var ring: String? { get set } </span><br style="font-size:13px;line-height:19.5px"><span style="font-size:13px;line-height:19.5px">        }</span><br style="font-size:13px;line-height:19.5px"></span><span class=""><span style="font-size:13px;line-height:19.5px">        protocol CallReceivable {</span><br style="font-size:13px;line-height:19.5px"><span style="font-size:13px;line-height:19.5px">                var ring: String? { get set }  </span><br style="font-size:13px;line-height:19.5px"><span style="font-size:13px;line-height:19.5px">        }</span><br style="font-size:13px;line-height:19.5px"><br style="font-size:13px;line-height:19.5px"></span><span style="font-size:13px;line-height:19.5px">        struct Person {</span><span style="font-size:13px;line-height:19.5px"> }</span><br></div><div>       </div><div>       extension <span style="font-size:13px;line-height:19.5px">Person:</span> <span style="font-size:13px;line-height:19.5px">Marriageable{</span></div><div><span style="font-size:13px;line-height:19.5px">         </span><span style="font-size:13px;line-height:19.5px">var ring: String?</span></div><div><span style="font-size:13px;line-height:19.5px">       }</span></div><div><span style="font-size:13px;line-height:19.5px"><br></span></div><div><div>     extension <span style="font-size:13px;line-height:19.5px">Person:</span> <span style="font-size:13px;line-height:19.5px">CallReceivable</span><span style="font-size:13px;line-height:19.5px">{</span></div><div><span style="font-size:13px;line-height:19.5px">         </span><span style="font-size:13px;line-height:19.5px">var ring: String?</span></div><div><span style="font-size:13px;line-height:19.5px">       }</span></div></div><div dir="ltr"><div><br></div><div>So:</div><div><br></div><div>var person = Person()</div><div>person.foo = 1 // ok<br></div><div><br></div><div>person.ring = getRingtone() // error, ring is ambiguous</div><div>(person as CallReceivable).ring = getRingtone()  // ok</div><div>OR</div><div>person.CallReceivable.ring = getRingtone()  // ok | CallReceivable is a know person protocol, so can get a implicity dot notation, like .dynamicType.staticMethod();</div><div><br></div><div>Anyway, it&#39;s not an easy problem to solve.<br></div><div><div class="h5"><div><br><div class="gmail_quote"><div dir="ltr">Em sáb, 9 de jan de 2016 às 01:09, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; escreveu:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; I don’t really get what you are driving at.<br>
<br>
The point is that, although `A` and `B` both require properties with the same name, they expect different semantics from that property. Let&#39;s maybe give these more concrete names so you can understand the idea:<br>
<br>
        protocol Marriageable {<br>
                var ring: String? { get set }   // File name of image of this person&#39;s wedding ring.<br>
        }<br>
        protocol CallReceivable {<br>
                var ring: String? { get set }   // File name of ringtone to be used for this person.<br>
        }<br>
<br>
        struct Person: Marriageable, CallReceivable {<br>
                var ring: String?<br>
        }<br>
<br>
Of course a person is marriageable and can this have &quot;a ring&quot;, and of course you can also receive a call from them and they can thus have &quot;a ring&quot;. But in reality, the &quot;ring&quot; that satisfies one of these things will not work for the other. If your best friend gets married and you add an image of the ring, then the next time your friend calls you, the phone ringing screen will try to play a JPEG as an MP3.<br>
<br>
The &quot;ring&quot; example is, of course, slightly contrived, but I&#39;m sure you can imagine a similar problem with real names, where you end up using the same term for two different and incompatible things.<br>
<br>
What the OP is basically asking is, when Swift sees the same type conforming to Marriageable and CallReceivable, should it optimistically assume that the `ring` properties they both require are compatible and allow the code to pass through without comment? Or should it pessimistically assume that the `ring` properties are incompatible and emit a warning or error about them?<br>
<br>
--<br>
Brent Royal-Gordon<br>
Architechies<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">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>
</blockquote></div></div></div></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=zv-2Fta8zZnJ-2BWwISX5RHdd79su-2FjoebtLz43a4s-2BYOw3J3zBGb9gePf56vlkwYYXLrBv75x50VwTC0GFIoZU1WUU6bNei-2FeRIRj1zddSc6QupVmaqIA8WyujVVkXYDBWxgoVf-2BMHjogZuAXL-2B6F-2BBt599iX7sppq4GCyUuqAncSd0wF5rPWKES7eETTMB8fZxY98zgHDw-2FgFtuPTXMUKgpNbZ9c2xnOWDiB3jBjhqVnc-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
<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><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Best Regards!<br><br>Yang Wu<br>--------------------------------------------------------<br>Location: Pudong, Shanghai, China.<br>EMail    : <a href="mailto:pinxue@gmail.com" target="_blank">pinxue@gmail.com</a><br>Website: <a href="http://www.time2change.mobi" target="_blank">http://www.time2change.mobi</a> <a href="http://rockplayer.com" target="_blank">http://rockplayer.com</a><br>Twitter/Weibo : @pinxue<br><a href="http://www.pinxue.net" target="_blank"></a></div></div>
</div>