我试图隐式定义关联类型,但是出现错误:
在这种情况下,“ 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)
我该如何做?
答案 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
中的Row
与T
中的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
}
}