gpt4 book ai didi

ios - 候选不是 '@objc' 但协议(protocol)需要它

转载 作者:IT王子 更新时间:2023-10-29 05:27:06 26 4
gpt4 key购买 nike

我一直在关注这个tutorial学习快速和 iOS 应用程序开发。在协议(protocol)部分,教程定义了以下协议(protocol):

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

它说如果你想要一个带有可选方法的协议(protocol),你必须在协议(protocol)前加上@objc标签(即使你的类没有与objective-C互操作)

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

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

我在我的 xcode playground 中尝试了上面的代码,但是我得到了编译器错误 “Type Vicki doesn't conform to protocol Speaker”

Xcode 还会弹出一个修复 文本,上面写着“Candidate is not '@objc' but protocol requires it”

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

最佳答案

据我所知,将您的协议(protocol)标记为@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?")
}
}

更新:来自 Apple 的 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' 但协议(protocol)需要它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31941771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com