[swift-users] Swift's method dispatch

Jens Persson jens at bitcycle.com
Fri Dec 8 08:25:38 CST 2017

Hi all!

Can someone please explain the rationale behind the last line printing
"T is unknown"
rather than (what I would expect):
"T is Int"
in the following program?

protocol P {
    associatedtype T
    func f() // *
extension P {
    func f() { print("T is unknown") }
extension P where T == Int {
    func f() { print("T is Int") }

struct X<T> : P {}

struct Y<U> where U: P, U.T == Int {
    // NOTE: The compiler/type-checker knows that U.T == Int here so ...
    typealias T = U.T
    var a: U
    func g() { a.f() } // ... how/why could this print anything but "T is

let x = X<Int>()
x.f() // Prints "T is Int", no matter if * is commented out or not.

let y = Y(a: X<Int>())
y.g() // Prints "T is unknown" unless * is commented out. Why?

IMHO this looks like the compiler simply ignores that struct Y<U> has the
constraint  U.T == Int.
How else to explain this behavior?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171208/dfb8379c/attachment.html>

More information about the swift-users mailing list