Swift - 泛型函数参数

Swift - Generic function parameter

我正在尝试这样做:

protocol Fly {
}

class Bird: Fly {
}

func fetch<T: Fly>(model: T) {
    print("Done")
}

let bird: Fly = Bird()
fetch(model: bird)

但是我得到这个错误:

Cannot invoke 'fetch' with an argument list of type '(model: Fly)'

我将 let bird: Fly = Bird() 设置为 Fly 类型,它不应该工作吗,因为函数 fetch 接受任何符合该协议的对象?

有什么想法吗?

您正在使用 Fly 对象创建 Bird 实例

替换代码

protocol Fly {
}

class Bird: Fly {
}

func fetch<T: Fly>(model: T) {
    print("Done")
}

let bird: Bird = Bird() // Here is a problem 
fetch(model: bird)

I set let bird: Fly = Bird() to be of type Fly, shouldn't it work since the function fetch takes any object that conforms to that protocol?

fetch(model: bird) 调用的重载解析是在编译时静态完成的。 bird 实例已被明确注释为 类型 Fly (这恰好是一个可以持有的协议,动态, 符合它的实例)。由于 ,对 fetch(model: bird) 的调用将不符合使用约束泛型方法 func fetch<T: Fly>(model: T) 的条件,因为 bird 的类型,即 Fly,不满足类型约束 T: Fly.