首页 文章

测试协议与相关类型的一致性

提问于
浏览
6

我有一个使用关联类型的协议,如下所示:

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 回答

  • 0

    正如错误所说,你不能把它投到Populatable这里 . 我认为正确的方法是将其转换为EventRowType .

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

    并且您已经测试过'EventRowType'类符合'Populatable'协议 . 因为如果EventRowType没有名为'populate'的函数,swift编译器说,

    类型'EventRowType'不符合协议'Populatable'

  • 0

    我不认为你能够在整个过程中使用泛型,除非可能使用AnyObject并在每个populateWith函数中测试参数的类 .

    但这会奏效:

    for (i, p) in enumerate(rowTypes) {
        if let dateRow = p as? DateRowType {
            dateRow.populateWith(data[i] as! NSDate)
        }
        else if let stringRow = p as? StringRowType {
            stringRow.populateWith(data[i] as! String)
        }
    }
    

    您只需要为添加的每个Populatable类扩展它 .

相关问题