You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:07