gpt4 book ai didi

ios - 为什么需要@objc 标签才能使用选择器?

转载 作者:行者123 更新时间:2023-11-28 14:05:52 25 4
gpt4 key购买 nike

我正在尝试使用选择器来查看某个协议(protocol)是否可以执行某个操作。当我这样尝试时:

protocol Test {
func hello()
func goodBye(a: String)
}

class Tester: NSObject, Test {
override init() {}
func hello() { }
func goodBye(a: String) { }
}

let a: Test = Tester()

let result = a.responds(to: Selector("goodByeWithA:"))

在这种情况下,result 的计算结果为 false

但是如果我将 @objc 标记添加到协议(protocol)中,它的计算结果为 true

@objc protocol Test {
func hello()
func goodBye(a: String)
}

这是为什么?

附带说明一下,我知道现在建议使用 #selector 语法并不再使用字符串,但出于各种原因,在这种情况下我必须使用字符串.

编辑:这只是在我将我的项目迁移到 Swift 4.2 后才开始发生

最佳答案

默认情况下,Swift 生成的代码仅供其他 Swift 代码使用,但如果您需要与 Objective-C 运行时交互(例如,所有 UIKit),您需要告诉 Swift 要做什么。

这就是 @objc 属性的用武之地:当您将它应用于类或方法时,它会指示 Swift 将这些东西提供给 Objective-C 以及 Swift 代码。因此,任何时候您想要从 UIBarButtonItem 或 Timer 调用方法时,您都需要使用 @objc 标记该方法,以便将其公开——这两者以及许多其他代码都是 Objective-C 代码。

别担心:如果您忘记在需要时添加 @objc,您的代码将无法编译 – 这不是您可以不小心忘记并引入错误的事情。

关于ios - 为什么需要@objc 标签才能使用选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988717/

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