让我们考虑这个没有任何问题编译的例子:
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:
代码。
答案 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 {
}