[swift-users] How do generics interact with overloaded methods?
Wallacy
wallacyf at gmail.com
Fri Jan 15 10:35:42 CST 2016
Sure,
Talk: https://developer.apple.com/videos/play/wwdc2015-409/
There is a part called: How Generics Work
There is another talk with other details, but cannot remember which.
And also is a doc:
https://github.com/apple/swift/blob/master/docs/Generics.rst
May you can see: Generics is more about protocols than "type substitution".
The point is: Unconstrained T, can be anything, so when compiler try to
compile this:
func read() -> T {
return self.myBar.read()
}
self.myBar.read() can only point to generic version. The overload will be
resolved once.
The compiler will not generate another version of this read() -> T for
every single call of Baz<T>.
Usually, unconstrained T and "Any" is the same thing. Generics is more
about "which overload Im will call at this point".
Generic specialization is a optimization phase.
Em qui, 14 de jan de 2016 às 16:13, Ryan Conway <theconmethod at gmail.com>
escreveu:
> Thank you for your responses. I'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.
>
> If I'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' generic
> function.
>
> I'd like to understand Swift's design philosophy better. Why were things
> implemented this way? For example, in the following line of code:
>
>
> let thisDoesntWork = Baz<UInt>().read()
>
>
> The compiler knows that read() is being called on Baz<UInt>, 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'm hearing, this is what
> C++ would use, but not Swift, and I imagine there is a good reason for it.
>
> Wallacy, if you're able to provide a link to this WWDC talk I would
> greatly appreciate it.
>
>
> Ryan
>
> On Thu, Jan 14, 2016 at 6:07 AM, Wallacy <wallacyf at gmail.com> wrote:
>
>> Generics are compile time feature, but like said, not like c++ templates.
>> Unconstrained generic T will be like Any. " return self.myBar.read()" can
>> only be translated to a "function pointer" to the generic version, because
>> is the only information available at compile time.
>> Has a talk on wwdc explaining this.
>> Swift can do generic specialization, but only when information enough to
>> do this. Usually constrained generic is the way to go.
>>
>>
>> Em qui, 14 de jan de 2016 às 05:05, Ryan Conway via swift-users <
>> swift-users at swift.org> escreveu:
>>
>>> Hey swift-users,
>>>
>>> I'm teaching myself Swift, coming from a mostly C and Python background,
>>> and would like to understand generics more deeply. Right now, I'm seeing
>>> generic data types invoke overloaded methods in ways I do not understand,
>>> and am seeking clarification why.
>>>
>>> In an effort to model a data structure whose data can be represented as
>>> multiple data types simultaneously, I've made this class. Here its
>>> implementation is mocked using constants.
>>>
>>> class Bar {
>>> func read() -> Int {
>>> return -1
>>> }
>>> func read() -> UInt {
>>> return 1
>>> }
>>> func read<T>() -> T {
>>> print("Unsupported data type requested")
>>> exit(1)
>>> }
>>> }
>>>
>>>
>>> Objects of that class return the requested type as expected when used
>>> like so:
>>>
>>> let thisWorks: Int = Bar().read() // returns -1
>>> let thisAlsoWorks: UInt = Bar().read() // returns 1
>>>
>>>
>>> However, when I introduce generics on top of that class, the expected
>>> method (the "most precise" method) is not called. For example, given this
>>> other class:
>>>
>>> class Baz<T> {
>>> let myBar = Bar()
>>>
>>> func read() -> T {
>>> return self.myBar.read()
>>> }
>>> }
>>>
>>>
>>> Both of these invocations call the generic read<T>() -> T method rather
>>> than the read() -> UInt method:
>>>
>>> let thisDoesntWork = Baz<UInt>().read()
>>> let thisDoesntWorkEither: UInt = Baz<UInt>().read()
>>>
>>>
>>> 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.
>>>
>>> Thank you,
>>> Ryan
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160115/a7db3b16/attachment.html>
More information about the swift-users
mailing list