Objective-C 的 [noop:] 函数在哪里定义?

Posted

技术标签:

【中文标题】Objective-C 的 [noop:] 函数在哪里定义?【英文标题】:Where is Objective-C's [noop:] function defined? 【发布时间】:2022-01-03 07:06:03 【问题描述】:

在 Swift 中,我如何测试给定的选择器是否为 noop: 选择器?

// Compiler error: Cannot find `noop` in score
override func doCommand(by selector: Selector) 
  if selector == #selector(noop(_:)) 
  

在 AppKit 应用程序中处理键盘事件时,NSResponder.doCommand(by:) 将使用 Selector 调用。如果键和弦未映射到已知动作,则将返回选择器noop:

在 Objective-C 中,您可以使用 @selector(noop:) 对此进行测试,但是在 Swift 中,如果您尝试使用 #selector(noop(_:)),则编译器会抱怨它无法解析该选择器。发生这种情况时,您通常只需在选择器前面加上它所属的类,例如:#selector(NSResponder.moveLeft(_:))

但是,我找不到 noop: 的定义位置。在头文件中搜索再多也找不到合适的匹配项。

【问题讨论】:

这是NSTextView 的事情,与***.com/q/9150773/3141234 有关吗? 好的,感谢您的仔细检查。这是一件非常小的事情,所以我想我会使用NSSelectorFromString。只是想成为“Swifty”。如果您这样发布,很高兴将其标记为答案。 (是的,与其他问题有些相关。实现一个自定义的类似集合的视图并希望正确处理 keyDown 事件。) 已发布,但我建议您推迟将其标记为已接受。也许有人有真正的答案。 顺便说一句,完全有可能没有称为noop:的方法。在响应者链上发送选择器在概念上与向NSNotificationCenter 发送字符串非常相似。选择器就像通知名称,碰巧链中的一个对象必须respondTo:该选择器(然后系统将向它发送该消息) 这种自带领地;整个 NSResponder 模式不是很“Swifty”,因为它完全没有类型。我认为这不一定是坏事。据推测,可以设想一个更强类型的响应者链对应物,它使用协议来更具体地了解支持的消息和所涉及的参数类型。虽然我认为这是一个很好地应用了动态性的领域,因为对象之间应该对彼此知之甚少,以至于试图用协议或类似的东西来确定它们的类型实际上可能是不可取的。 【参考方案1】:

我可以确认整个 MacOSX.sdk 中没有定义 noop: 方法的标头。

解决方法:您可以使用NSSelectorFromString("noop:")

当然,这绕过了编译器使用更特殊的#selector(Class.method) 语法为您进行的正确性检查。

【讨论】:

似乎 Swift 中的Selector 也是ExpressibleByStringLiteral,所以可以简单地比较selector == "noop:" 而无需通过Objective-C NSSelectorFromString 虽然文档没有提到它,但它已被弃用:“Objective-C 选择器的字符串文字已被弃用;请改用#selector

以上是关于Objective-C 的 [noop:] 函数在哪里定义?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)

Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)

Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)

Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)

我的 OpenCL 代码根据看似 noop 更改输出

Angular 6 有 angular.noop 吗?