将项目迁移到swift 3时的withSender后缀

时间:2017-01-29 13:13:45

标签: swift

我有一个用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代码没有这个后缀......

enter image description here

@IBAction func on_btn_quitter(sender: NSButton) {
    NSApp.terminate(nil)
}

由于

1 个答案:

答案 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)