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