我正在尝试这样做:
protocol Fly {
}
class Bird: Fly {
}
func fetch<T: Fly>(model: T) {
print("Done")
}
let bird: Fly = Bird()
fetch(model: bird)
但是我收到了这个错误:
无法使用类型'(model:Fly)'
的参数列表调用'fetch'
我将let bird: Fly = Bird()
设置为Fly
类型,因为函数fetch
采用符合该协议的任何对象,所以不应该有效吗?
有什么想法吗?
答案 0 :(得分:2)
您正在使用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)
答案 1 :(得分:2)
我将
let bird: Fly = Bird()
设置为Fly
类型,不应该有效,因为函数提取需要符合任何对象的任何对象 协议
fetch(model: bird)
调用的重载决策是在编译时静态完成的。 bird
实例已明确注释为 type Fly
(恰好是一个可以保存的协议,动态,符合的实例它)。自protocols doesn't conform to themselves起,对fetch(model: bird)
的调用将无法使用受约束的通用方法func fetch<T: Fly>(model: T)
,因为bird
的类型,即Fly
,不会完成类型约束T: Fly
。