我有一个使用关联类型的协议(protocol),例如:

protocol Populatable {
    typealias T
    func populateWith(object: T)
}

和实现该协议(protocol)的类:
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])
}

我得到错误:



测试对象是否符合Populatable协议(protocol)的正确方法是什么?

注意:尝试此操作所需的所有代码都包含在问题中,只需将代码块复制到操场上即可。

最佳答案

正如错误所言,您不能在此处将其强制转换为Populatable。我认为正确的方法是将其强制转换为EventRowType。

if let rowController = self.table.rowControllerAtIndex(i) as? EventRowType {

并且您已经测试了'EventRowType'类是否符合'Populatable'协议(protocol)。因为如果EventRowType没有名为“populate”的函数,则swift编译器会说,

08-18 03:43