Swift3.1-NSApplication.terminate或NSApplication.shared().terminate

Swift3.1-NSApplication.terminate或NSApplication.shared().terminate,swift3,xcode8,Swift3,Xcode8,使用旧样式创建StatusBarMenuItem,效果很好。然而,由于一个警告,我确实想更改我的代码符合Swift 3.1,从 menu.addItem(NSMenuItem(title: "Quit terminate", action: Selector(("terminate:")), keyEquivalent: "q" )) 到 然后我发现他们不仅将选择器(((“terminate:))部分更改为#选择器,而且将terminate部分更改为 menu.addItem(NSMenuIt

使用旧样式创建StatusBarMenuItem,效果很好。然而,由于一个警告,我确实想更改我的代码符合Swift 3.1,从

menu.addItem(NSMenuItem(title: "Quit terminate", action: Selector(("terminate:")), keyEquivalent: "q" ))

然后我发现他们不仅将选择器(((“terminate:))部分更改为#选择器,而且将terminate部分更改为

menu.addItem(NSMenuItem(title: "Quit NSAppl.terminate", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q" ))
但是下面的方法也很有效(注意“.shared()”部分)

但是,当我想从quitAction函数中删除.shared()部分时,会出现一个编译器错误。我的问题是:“为什么我可以使用选择器而不是在代码行中保留shared()部分?”这是什么原因?谢谢

实际上,问题应该更像是“为什么我可以使用选择器插入shared()部分”

附加图像

具有语法
Type.method
的选择器将
方法
发送到
目标
参数中指定的
类型
实例

我假设在macOS中,没有指定目标的选择器被发送到
FirstResponder
忽略
类型
。方法
终止:
暴露给
FirstResponder


在代码中,您必须将方法发送到实例,因此需要
shared()

具有语法
类型的选择器。方法
方法发送到
目标
参数中指定的
类型
实例

我假设在macOS中,没有指定目标的选择器被发送到
FirstResponder
忽略
类型
。方法
终止:
暴露给
FirstResponder


在代码中,您必须将方法发送到实例,因此需要
shared()

当您单击“退出NSAppl.shared.terminate”菜单项时,“退出NSAppl.shared.terminate”菜单项是否按预期工作?我怀疑它在运行时会出现“无法识别的选择器”错误是的,所有4种方式都工作正常。没有错误。我将尝试添加一个图像。是否退出NSAppl.shared.terminate“菜单项在您单击它时按预期工作?我怀疑它在运行时会出现“无法识别的选择器”错误是的,所有4种方式都工作正常。没有错误。我将尝试添加图像。
menu.addItem(NSMenuItem(title: "Quit NSAppl.terminate", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q" ))
menu.addItem(NSMenuItem(title: "Quit NSAppl.shared.terminate", action: #selector(NSApplication.shared().terminate(_:)), keyEquivalent: "q" ))