<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Hi, Dimitri. The Swift compiler always tries to choose the most specific function when it tries to satisfy protocol requirements. In your case, that means it's going to prefer members defined in concrete types over members defined in protocol extensions. Unfortunately I think that means you're not getting the Collection you expect—the "additional" subscript becomes the "more specific" one, and the compiler decides that the collection Element should be 'String?'. As you noted, you can use typealiases to explicitly control that and keep the compiler from having to guess.</div><div class=""><br class=""></div><div class="">Hope that clears things up,</div><div class="">Jordan</div><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Sep 4, 2017, at 03:41, Dimitri Racordon via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</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="">
<div class="">Hello fellow Swift enthusiasts.</div>
<div class=""><br class="">
</div>
<div class="">I’m struggling to understand why type inference fails to solve&nbsp;<span style="font-family: Consolas;" class="">Collection</span>&nbsp;s associated types while trying to provide it with a default implementation, via protocol extensions, when an additional
 subscript is provided. Here is a minimal example:</div>
<div class=""><br class="">
</div>
<div class="">
<div class=""><font face="Consolas" class="">protocol SearchTree: Collection {</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; subscript(key: Int) -&gt; String? { get }</font></div>
<div class=""><font face="Consolas" class="">}</font></div>
<div class=""><font face="Consolas" class=""><br class="">
</font></div>
<div class=""><font face="Consolas" class="">extension SearchTree {</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; // MARK: Conformance to Sequence</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; func makeIterator() -&gt; AnyIterator&lt;(key: Int, value: String)&gt; {</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; &nbsp; &nbsp; return AnyIterator { nil }</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; }</font></div>
<div class=""><font face="Consolas" class=""><br class="">
</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; // MARK: Conformance to Collection</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; var startIndex: Int { return 0 }</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; var endIndex: Int { return 0 }</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; func index(after i: Int) -&gt; Int { return 0 }</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; subscript(key: Int) -&gt; (key: Int, value: String) { return (0, "") }</font></div>
<div class=""><font face="Consolas" class=""><br class="">
</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; // MARK: Conformance to SearchTree</font></div>
<div class=""><font face="Consolas" class="">&nbsp; &nbsp; subscript(key: Int) -&gt; String? { return nil }</font></div>
<div class=""><font face="Consolas" class="">}</font></div>
<div class=""><font face="Consolas" class=""><br class="">
</font></div>
<div class=""><font face="Consolas" class="">struct ConformingTree: SearchTree { &nbsp; &nbsp;</font></div>
<div class=""><font face="Consolas" class="">}</font></div>
</div>
<div class=""><br class="">
</div>
<div class="">Swift’s compiler complains that <font face="Consolas" class="">ConformingTree</font> doesn’t conform to&nbsp;<span style="font-family: Consolas;" class="">Collection</span>. But it doesn’t say a word if I either remove the additional subscript `<span style="font-family: Consolas;" class="">(key:
 Int) -&gt; String?</span>`, or if I push the declaration of the subscript in&nbsp;<span style="font-family: Consolas;" class="">ConformingTree</span>.</div>
<div class=""><br class="">
</div>
<div class="">I asked this question on StackOverflow (<a href="https://stackoverflow.com/questions/46028205" class="">https://stackoverflow.com/questions/46028205</a>), and was kindly taught that I should specify associated types in the protocol (or in the
 extension via type aliases) because the type inference was getting confused determining the type of
<font face="Consolas" class="">Collection.Element</font>, having to deal with two subscripts. What I still don’t understand is why the type inference doesn’t need such explicit additional information when the implementation of
<font face="Consolas" class="">SearchTree</font>’s requirement is placed in the concrete type.</div>
<div class=""><br class="">
</div>
<div class="">Could anyone enlighten me on this?</div>
<div class=""><br class="">
</div>
<div class="">Thanks a lot for your time.</div>
<div class="">Best regards.</div>
<br class="">
<div class="">
<div style="letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
Dimitri Racordon<br class="">
CUI, Université de Genève<br class="">
7, route de Drize, CH-1227 Carouge - Switzerland<br class="">
Phone: +41 22 379 01 24
<div class=""><br class="">
</div>
</div>
<br class="Apple-interchange-newline">
<br class="Apple-interchange-newline">
</div>
<br class="">
</div>

_______________________________________________<br class="">swift-dev mailing list<br class=""><a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-dev<br class=""></div></blockquote></div><br class=""></body></html>