我有一个用Swift 2编写的旧Xcode项目。 我用Xcode最后一个版本打开了这个项目。我没有迁移到Swift 3.我改为在构建设置中更改选项(Swift legacy为YES)。
现在我想迁移到Swift 3.我把这个swift选项设置为NO并且我检查了每行代码以更改为Swift 3语法。
我在故事板(Interface Builder)中遇到了问题。我的所有@IBAction
都显示了" withSender"后缀。我不得不删除并重新创建所有@IBAction
绑定。
这是什么" withSender"后缀?这是一个错误吗?
这是一个Cocoa项目。 这很奇怪,因为Interface Builder使用" withSender"显示了一个函数名称。后缀,但正如你在屏幕截图中看到的,真正的Swift代码没有这个后缀......
@IBAction func on_btn_quitter(sender: NSButton) {
NSApp.terminate(nil)
}
由于
答案 0 :(得分:0)
这是由于Swift 3的变化。现在调用函数时需要第一个参数名称。
例如,如果您有一个函数foo(bar: Int)
,则在Swift 2中使用foo(7)
调用此函数,但在Swift 3中调用foo(bar: 7)
。
这会影响函数名称转换为 Objective C Selector 的方式。如果需要第一个参数名称,它将成为选择器的一部分。通过附加WithParametername
添加第一个参数名称。由于Swift 3默认需要第一个参数名称,因此现在需要在第一个参数名称之前添加_
以禁止该行为以获得与Swift 2相同的 Selector 名称。
这是一个表格,用于显示 Objective C 选择器与Swift func
语法之间的关系:
ObjC Selector Swift 3 Swift 2
------------- -------------------- ----------------------
fooWithBar: func foo(bar: Int) func foo(bar bar: Int)
foo: func foo(_ bar: Int) func foo(bar: Int)
通常Xcode会在转换时为您翻译,但我怀疑自从您第一次使用Swift 2.3然后转到Swift 3后,您最终得到了未翻译的函数签名。
要手动修复此问题,请在第一个参数名称前添加_
:
@IBAction func on_btn_quitter(_ sender: NSButton)