即使在使用@objc协议的协议扩展满足要求之后,也会出现一致性问题

时间:2016-05-10 14:04:05

标签: ios swift swift-protocols

让我们考虑这个没有任何问题编译的例子:

protocol AProtocol {
    func veryImportantMethod()
}

protocol BProtocol : AProtocol {

}

extension BProtocol {
    func veryImportantMethod() {
        print("A's protocol requirement satisfied!")
    }
}

class ConcreteClass : BProtocol {

}

但是,如果我们这样做:

@objc protocol AProtocol { //Added @objc here
    func veryImportantMethod()
}

protocol BProtocol : AProtocol {

}

extension BProtocol {
    func veryImportantMethod() {
        print("A's protocol requirement satisfied!")
    }
}

class ConcreteClass :  BProtocol {

} 

它没有使用以下消息进行编译:

  

Type' ConcreteClass'不符合协议' AProtocol'

但是,如果我们实际实现它,

class ConcreteClass : NSObject, BProtocol {
    func veryImportantMethod() { }
}

代码编译。为什么会这样?我在这里缺少什么吗?

我正在尝试为UITableViewDataSource实现这种形式的协议层次结构,我真的不想在符合条件下重复tableView:cellForRowAtIndexPath:代码。

1 个答案:

答案 0 :(得分:0)

编译器希望确保可以使用ObjC编译该类。一旦从ObjC类继承(如NSObject),编译器就会知道它,但是在那之前你实现了扩展。您可以通过定义由继承自NSObject的类实现的协议来避免错误,如下所示:

@objc protocol AProtocol {
    func veryImportantMethod()
}

protocol BProtocol : AProtocol {

}

class BProtocolClass: NSObject {

}

extension BProtocolClass {
    func veryImportantMethod() {
        print("A's protocol requirement satisfied!")
    }
}

class ConcreteClass: BProtocolClass {

}