Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 {

}