我有一个使用关联类型的协议,如下所示:
protocol Populatable {
typealias T
func populateWith(object: T)
}
和实现协议的类:
class DateRowType: Populatable {
func populateWith(object: NSDate) {
print(object.description)
}
}
class StringRowType : Populatable {
func populateWith(object: String) {
print(object)
}
}
但是当我尝试投射或测试一致性时,像这样:
let drt = DateRowType()
let srt = StringRowType()
let rowTypes = [drt, srt]
let data = [NSDate(), "foo"]
for (i, p: Populatable) in enumerate(rowTypes) {
p.populateWith(data[i])
}
我收到错误:
Protocol'Populatable'只能用作通用约束,因为它具有Self或相关类型要求
测试对象是否符合Populatable协议的正确方法是什么?
注意:尝试此操作所需的所有代码都包含在问题中,只需将代码块复制到操场中即可 .
2 回答
正如错误所说,你不能把它投到Populatable这里 . 我认为正确的方法是将其转换为EventRowType .
并且您已经测试过'EventRowType'类符合'Populatable'协议 . 因为如果EventRowType没有名为'populate'的函数,swift编译器说,
我不认为你能够在整个过程中使用泛型,除非可能使用AnyObject并在每个populateWith函数中测试参数的类 .
但这会奏效:
您只需要为添加的每个Populatable类扩展它 .