Ios 即使在使用@objc协议的协议扩展满足需求之后,一致性问题仍然存在 让我们考虑这个没有任何问题编译的例子: protocol AProtocol { func veryImportantMethod() } protocol BProtocol : AProtocol { } extension BProtocol { func veryImportantMethod() { print("A's protocol requirement satisfied!") } } class ConcreteClass : BProtocol { }
但是,如果我们这样做:Ios 即使在使用@objc协议的协议扩展满足需求之后,一致性问题仍然存在 让我们考虑这个没有任何问题编译的例子: protocol AProtocol { func veryImportantMethod() } protocol BProtocol : AProtocol { } extension BProtocol { func veryImportantMethod() { print("A's protocol requirement satisfied!") } } class ConcreteClass : BProtocol { },ios,swift,swift-protocols,Ios,Swift,Swift Protocols,但是,如果我们这样做: @objc protocol AProtocol { //Added @objc here func veryImportantMethod() } protocol BProtocol : AProtocol { } extension BProtocol { func veryImportantMethod() { print("A's protocol requirement satisfied!") } } clas
@objc protocol AProtocol { //Added @objc here
func veryImportantMethod()
}
protocol BProtocol : AProtocol {
}
extension BProtocol {
func veryImportantMethod() {
print("A's protocol requirement satisfied!")
}
}
class ConcreteClass : BProtocol {
}
它不会编译时显示以下消息:
类型“ConcreteClass”不符合协议“AProtocol”
但是,如果我们真的实施的话,
class ConcreteClass : NSObject, BProtocol {
func veryImportantMethod() { }
}
代码可以编译。为什么会这样?这里有我遗漏的东西吗
我正在尝试为
UITableViewDataSource
实现这种形式的协议层次结构,我真的不想在符合项之间重复tableView:cellforrowatinexpath:
代码 编译器希望确保可以使用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 {
}