我的 Xcode 最近已更新到带有 Swift 3 的 Xcode 8。我注意到,当将操作附加到 ViewController 函数时,会以这种样式生成:
@IBAction func methodName(_ sender: UIButton) {
}
我不明白放 _ 的目的是什么。谁能解释为什么它在那里?在以前的 Swift 2.2 中,它不存在。
另一个问题是,我之前通过观看教程完成的项目已经迁移到 Swift 3,并且有一种方法看起来像这样:
func toggleButtons(toggle: Bool) {
yesButton.isUserInteractionEnabled = toggle
noButton.isUserInteractionEnabled = toggle
}
我是这样调用这个方法的:toggleButtons(false) 仍然没有传递参数名称。现在迁移器已将其更改如下,但在稍后的代码中调用方法时没有任何更改。
func toggleButtons(_ toggle: Bool) {
yesButton.isUserInteractionEnabled = toggle
noButton.isUserInteractionEnabled = toggle
}
和之前的情况有什么不同吗?
最佳答案
其他答案(其中一个已被删除)涵盖了 _ 的含义:它在您调用方法时消除了关键字。
但是,您的问题具体是关于“将操作附加到 ViewController”。
具有 @IBAction 属性的方法可以连接到 Storyboard(或 xib)中的控件。这意味着方法的名称将作为字符串存储在 Storyboard 中,并将使用 Objective-C 消息发送系统调用。因此,确切的名称以及名称如何转换为 Objective-C,在这里非常重要。
如果声明方法 func methodName(sender: UIButton),那么它的 Objective-C 名称是 methodNameWithSender:。
如果声明方法 func methodName(_ sender: UIButton),那么它的 Objective-C 名称是 methodName:。
iOS 和 macOS 都有称为“响应者链”的东西,它让系统搜索可以处理操作的对象(“响应者”)。您可以将 Storyboard 中的控件连接到 First Responder(在文档大纲的顶部)以让系统执行此操作。大多数情况下,您在 macOS 中使用菜单项执行此操作,但还有其他用途。
无论如何,有一些标准操作,如cut:、copy: 和paste:。例如,您可以将 Cut 菜单项的操作设置为将 cut: 发送到 First Responder。如果你想在你的 View Controller 中实现 cut: 方法,它的名称(当翻译成 Objective-C 时)准确地是 cut: 是很重要的,而不是cutWithSender:。如果命名为cut:,系统会在搜索响应者链时找到它,但如果命名为cutWithSender:,系统将不会找到它,您会想知道为什么您的菜单项不起作用。
Xcode 知道这一点,所以它总是创建 @IBAction func action(_ sender: UIButton) 形式的操作方法,省略参数中的关键字,以防您正在实现需要的操作通过搜索响应者链找到。
在 Swift 3 中,方法的每个参数默认都有一个关键字,包括第一个参数。在 Swift 2 中,第一个参数默认没有关键字,所以第一个参数上的 _ 在 Swift 2 中是多余的(并且会产生编译器警告) .这就是 Xcode 8 (Swift 3) 放入 _ 但 Xcode 7 (Swift 2.2) 没有的原因。
这也是您的 toggleButtons 示例在 Xcode 7 中工作的原因。
关于ios - swift 3 : Why symbol _ is added before sender in parameters of action?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554622/