未隐式定义关联类型的通用协议

时间:2018-08-29 21:33:44

标签: ios swift generics protocols associated-types

我试图隐式定义关联类型,但是出现错误:

  

在这种情况下,“ RowProtocol”对于类型查找是不明确的

protocol RowProtocol {
    associatedtype T
    var cellClass: T.Type { get }
    init(cellClass: T.Type)
}

struct Row: RowProtocol {
    let cellClass: T.Type
    init(cellClass: T.Type) {
        self.cellClass = cellClass
    }
}

然后您可以使用以下方法对其进行初始化:

let implicitRow = Row(cellClass: Cell.self)

我该如何做?

1 个答案:

答案 0 :(得分:0)

符合RowProtocol要求将关联的类型T映射到具体类型,而Row则不这样做。我假设您还想使Row通用,这就是为什么您没有从协议中为T指定类型别名的原因。

解决方案是同时使Row通用:

struct Row<T>: RowProtocol {
    let cellClass: T.Type
    init(cellClass: T.Type) {
        self.cellClass = cellClass
    }
}

现在,编译器很高兴,因为它具有要传递给RowProtocol的具体类型。请记住,尽管对于编译器,T中的RowT中的RowProtocol是不同的,后者是协议的要求,而第一个是通用的。 / p>

// exactly the same struct, but with different name for the generic argument.
struct Row<U>: RowProtocol {
    let cellClass: U.Type
    init(cellClass: U.Type) {
        self.cellClass = cellClass
    }
}