ios – 候选不是’@objc’,但协议需要它

我一直在跟着这个tutorial学习swift& iOS应用程序开发.在“协议”部分中,本教程定义了以下协议:

@objc protocol Speaker {
  func Speak()
  optional func TellJoke()
}

它说如果你想有一个可选方法的协议,你必须使用@objc标记前缀协议(即使你的类不与Objective-C进行互操作).

然后,它显示了实现协议的示例:

class Vicki: Speaker {
  func Speak() {
    println("Hello, I am Vicki!")
  }
  func TellJoke() {
    println("Q: What did Sushi A say to Sushi B?")
  }
}

我在我的xcode操场上尝试了上面的代码,但是我得到了编译器错误“类型Vicki不符合协议扬声器”.

Xcode还会弹出一个修复文本,它说“候选不是”@objc’,但协议需要它“.

我现在完全感到困惑,本教程根本没有提到这个错误.有人可以向我解释这一切,使我清楚吗?谢谢!

从我可以看出,将协议标记为@objc意味着任何实现它的类也必须暴露于Objective-C.这可以通过使Vicki成为NSObject的子类:

class Vicki: NSObject, Speaker {

或者通过将每个实现的方法标记为@objc:

class Vicki: Speaker {
    @objc func Speak() {
        print("Hello, I am Vicki!")
    }
    @objc func TellJoke() {
        print("Q: What did Sushi A say to Sushi B?")
    }
}

更新:从苹果的Swift Language Documentation

Optional protocol requirements can only be specified if your protocol is marked with the @objc attribute.

Note also that @objc protocols can be adopted only by classes, and not
by structures or enumerations. If you mark your protocol as @objc in
order to specify optional requirements, you will only be able to apply
that protocol to class types.

翻译自:https://stackoverflow.com/questions/31941771/candidate-is-not-objc-but-protocol-requires-it

转载注明原文:ios – 候选不是’@objc’,但协议需要它