swift 2.0 : can not pass generic as a parameter

标签 swift generics

为什么这不起作用(即使容器符合 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)
}

enter image description here

最佳答案

编译器显示此警告是有原因的: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/

相关文章:

dictionary - 将 NSDictionary 转换为 Swift 字典

xcode - 使用未解析的标识符 'FIRDatabase'

c# - 使用带有泛型类的 ContextBuilder 使用 Entity Framework 4 创建 EDMX/DB-Schema 的异常

ios - 加载更多事件单元格 CollectionViewCell

ios - 如何将 json 数据拆分为 2 个不同的数组?

ios - 对于大于 PI 的值,CAKeyFrameAnimation 不是线性的

java - 将静态字段作为通用类型传递

c# - 匿名类型 - 是否有任何显着特征?

java - 如何获取List子类的REAL类型参数?

java - 如何允许基本自动配置类?当我有两个扩展它时,只有第一个被调用