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


  在这种情况下,“ 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)


我该如何工作?

最佳答案

符合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不同,后者是协议要求,而第一个是通用要求。

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

09-07 13:58