为什么这不起作用(即使容器符合 Unique 协议(protocol)。)以及最好的解决方法是什么?
protocol Unique {
var uniqueId: String {get}
}
struct Container <T>: Unique {
typealias UnderlyingObject = T
var object: UnderlyingObject
var uniqueId: String
}
func myFunc(protocolClosure: (Unique, Unique) -> Unique) {
print("...")
}
func problemStartsHere<T,S,U>(paramClosure: (Container<T>, Container<S>) -> Container<U>) {
myFunc(paramClosure)
}
最佳答案
编译器显示此警告是有原因的:myFunc
期望一个适用于任何类型的闭包 Unique
不只是Container<T>
.
您应该改用该函数的通用版本:
func myFunc<A: Unique, B: Unique, C: Unique>(protocolClosure: (A, B) -> C) {
print("...")
}
编辑:假设您想调用函数 problemStartsHere
像这样:
problemStartsHere { (c1: Container<Int>, c2: Container<Int>) -> Container<Int> in
print(c1.object, c2.object)
return c1
}
请注意该函数使用了 Container
-特定属性 object
.不是编译器究竟应该如何创建一个适用于任何 Unique
的闭包?它不能这样工作,因为它没有意义,这样的功能不能在任何 Unique
上工作.
关于 swift 2.0 : can not pass generic as a parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658806/