草庐IT

ios - swift 3 : Why symbol _ is added before sender in parameters of action?

coder 2023-09-06 原文

我的 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/

有关ios - swift 3 : Why symbol _ is added before sender in parameters of action?的更多相关文章

随机推荐