Objective-C的noop:函数定义位置及Swift检测noop:选择器的方法
问题解答
1. noop:选择器的定义位置
noop:是AppKit框架的内部未公开API,没有声明在任何公开头文件中,属于NSResponder体系下的私有约定,当doCommand(by:)没有匹配到对应按键的响应方法时,就会返回这个固定的选择器,这也是你遍览公开头文件找不到对应定义的原因。
Objective-C的@selector语法不要求编译期验证方法是否存在,因此可以直接使用未公开的noop:选择器。
2. Swift中检测noop:选择器的方案
Swift的#selector语法要求必须能在编译期找到对应方法的公开声明,因为noop:没有公开声明,所以直接用#selector(noop(_:))会报错,可选择以下两种方案解决:
方案1:直接通过字符串构造Selector
noop:作为AppKit沿用十几年的固定约定,选择器字符串不会随系统版本变更,硬编码不存在兼容性风险:
override func doCommand(by selector: Selector) { if selector == Selector("noop:") { // 匹配到noop选择器的业务逻辑 } }
方案2:声明同名方法适配#selector语法
如果不想硬编码字符串,可在当前响应者子类中声明一个同名空方法,即可正常使用#selector:
// 仅用于编译期匹配选择器,不会覆盖系统原有逻辑 @objc func noop(_ sender: Any?) {} override func doCommand(by selector: Selector) { if selector == #selector(noop(_:)) { // 匹配到noop选择器的业务逻辑 } }
内容的提问来源于stack exchange,提问作者kennyc
相关产品推荐
相关产品推荐

