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

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

概述我一直在跟着这个 tutorial学习swift& iOS应用程序开发.在“协议”部分中,本教程定义了以下协议: @objc protocol Speaker { func Speak() optional func TellJoke()} 它说如果你想有一个可选方法的协议,你必须使用@objc标记前缀协议(即使你的类不与Objective-C进行互 *** 作). 然后,它显示了实现协议的示例 我一直在跟着这个 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还会d出一个修复文本,它说“候选不是”@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.

总结

以上是内存溢出为你收集整理的ios – 候选不是’@objc’,但协议需要它全部内容,希望文章能够帮你解决ios – 候选不是’@objc’,但协议需要它所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1110525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存