为什么这不起作用(即使容器符合唯一的协议),最好的解决方法是什么?

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)
}

swift - Swift 2.0:无法将泛型作为参数传递-LMLPHP

最佳答案

编译器显示此警告的原因是: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上工作。

10-07 13:12
查看更多