在使用Swift的过程中,可能会遇到包含 #selectore 的代码:
helpMenu.addItem(withTitle: "访问帮助页面", action: #selector(openHelp), keyEquivalent: "?")
#selector 是 Swift 中用来引用 Objective-C 方法(即“选择器”)的语法,它的作用是告诉系统:当某个事件发生时,应该调用哪个方法。
什么是 Selector?
Selector 是 Objective-C 世界中的一个概念,表示方法的名称,用于动态调用方法。
例如:
@objc func quitApp() {
NSApp.terminate(nil)
}
可以用 Selector 来引用这个方法:
let quitItem = NSMenuItem(title: "退出", action: #selector(quitApp), keyEquivalent: "q")
系统就知道,当用户点击这个菜单项时,要调用 quitApp() 方法。
语法说明
#selector(方法名)
或者如果方法带参数:
#selector(methodName(_:))
比如:
@objc func showAlert(_ sender: Any?) {
// ...
}
button.action = #selector(showAlert(_:))
为什么要加 @objc?
因为 Selector 属于 Objective-C 的运行时机制,Swift 方法默认是静态调度的(编译时确定),必须加 @objc 才能暴露给运行时,也才能被 #selector 使用。
@objc func xxx() {} // 可以 selector
func xxx() {} // 编译错误(不是 @objc)
总结
#selector是Swift 中引用 Objective-C 方法的一种语法,常用于按钮、菜单、通知等回调触发,被引用的方法必须加 @objc 修饰。
在SwiftUI中使用闭包处理事件:
Button("退出") {
NSApp.terminate(nil)
}
而 AppKit / UIKit 中使用 Selector,更接近 Objective-C 风格。