<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-family:arial,sans-serif;font-size:13px">The compiler knows that read() is being called on Baz&lt;UInt&gt;, so it could know that read() must return a UInt, </span></blockquote><div class="gmail_default"><br></div><div class="gmail_default">I think there are two steps here.</div><div class="gmail_default"><ol><li>compiler choose <span style="font-size:13px">func read&lt;T&gt;() -&gt; T base on the return type of </span><span style="font-size:13px">func read() -&gt; T</span></li><li>compiler replace T with UInt</li></ol><div>In your mind, the steps are reversed. </div><div><br></div><div>In fact, there is no overload here. </div><div><br></div><div>Code:</div><div><br></div><div>let thisDoesntWork = Baz&lt;UInt&gt;().myBar.read() // error: ambiguous use of &#39;read()&#39;<br></div><div><br></div><div>Compiler doesn&#39;t know which function to choose as there is no return type to derive from。</div></div><br style="color:rgb(80,0,80);font-size:13px"><div>z<div class="gmail_default" style="font-family:georgia,serif;display:inline">​haoxin​</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 15, 2016 at 2:13 AM, Ryan Conway via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@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"><div><div><div><div><div>Thank you for your responses. I&#39;m grateful for having been given several different perspectives, especially in such a short time, and have some ideas for things to try this weekend.<br></div><br></div>If
 I&#39;m understanding correctly, the salient point is that Swift will 
resolve a call to an overloaded function to exactly one implementation 
of that overloaded function, even if for all types of a generic class&#39; 
generic function.<br></div><div><br></div>I&#39;d like to understand Swift&#39;s
 design philosophy better. Why were things implemented this way? For 
example, in the following line of code:<span class=""><br><br>let thisDoesntWork = Baz&lt;UInt&gt;().read()<br><br><br></span></div>The
 compiler knows that read() is being called on Baz&lt;UInt&gt;, so it 
could know that read() must return a UInt, so it could know that it can 
safely use the Bar.read() that returns a UInt. From what I&#39;m hearing, 
this is what C++ would use, but not Swift, and I imagine there is a good
 reason for it.<br><br></div><div>Wallacy, if you&#39;re able to provide a link to this WWDC talk I would greatly appreciate it.<span class="HOEnZb"><font color="#888888"><br><br>Ryan<br></font></span></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 14, 2016 at 6:07 AM, Wallacy <span dir="ltr">&lt;<a href="mailto:wallacyf@gmail.com" target="_blank">wallacyf@gmail.com</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">Generics are compile time feature, but like said, not like c++ templates.<div><div>Unconstrained generic T will be like Any. &quot; return self.myBar.read()&quot; can only be translated to a &quot;function pointer&quot; to the generic version, because is the only information available at compile time.</div><div>Has a talk on wwdc explaining this.</div><div>Swift can do generic specialization, but only when information enough to do this. Usually constrained generic is the way to go.</div></div><div><br></div><div><br><div class="gmail_quote"><div><div><div dir="ltr">Em qui, 14 de jan de 2016 às 05:05, Ryan Conway via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; escreveu:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><span style="font-size:12.8px">Hey swift-users,</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I&#39;m teaching myself Swift, coming from a mostly C and Python background, and would like to understand generics more deeply. Right now, I&#39;m seeing generic data types invoke overloaded methods in ways I do not understand, and am seeking clarification why.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">In an effort to model a data structure whose data can be represented as multiple data types simultaneously, I&#39;ve made this class. Here its implementation is mocked using constants.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>class Bar {</div><div>    func read() -&gt; Int {</div><div>        return -1</div><div>    }</div><div>    func read() -&gt; UInt {</div><div>        return 1</div><div>    }</div><div>    func read&lt;T&gt;() -&gt; T {</div><div>        print(&quot;Unsupported data type requested&quot;)</div><div>        exit(1)</div><div>    }</div><div>}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Objects of that class return the requested type as expected when used like so:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>let thisWorks: Int = Bar().read() // returns -1</div><div>let thisAlsoWorks: UInt = Bar().read() // returns 1<br></div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">However, when I introduce generics on top of that class, the expected method (the &quot;most precise&quot; method) is not called. For example, given this other class:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>class Baz&lt;T&gt; {</div><div>    let myBar = Bar()</div><div>    </div><div>    func read() -&gt; T {</div><div>        return self.myBar.read()</div><div>    }</div><div>}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Both of these invocations call the generic read&lt;T&gt;() -&gt; T method rather than the read() -&gt; UInt method:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>let thisDoesntWork = Baz&lt;UInt&gt;().read()</div><div>let thisDoesntWorkEither: UInt = Baz&lt;UInt&gt;().read()</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Am I using generics wrong here? Is there some other language feature I should be using to capture this data? Any pointers would be greatly appreciated.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Thank you,</div><div style="font-size:12.8px">Ryan</div></div>
</div></div><span><img alt="" 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" border="0" height="1" width="1">
_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
</span></blockquote></div></div></div>
</blockquote></div><br></div>
<img 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">
</div></div><br>_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><br>Owen Zhao<br></div></div></div>
</div>