Swift - 通用函数参数

时间:2017-08-03 04:57:56

标签: swift xcode generics swift-protocols ion

我正在尝试这样做:

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采用符合该协议的任何对象,所以不应该有效吗?

有什么想法吗?

2 个答案:

答案 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