在什么情况下,我应该在 swift 中使用 _ 作为参数

In what situation, should I use _ as a parameter in swift

我是 apple 的新手 Swift.I 我正在尝试基于此 tutorial 构建一个演示应用程序。我发现该应用程序无法正常工作。经过多次尝试和失败,我发现如果我更改代码行:

func textFieldDidEndEditing(textField: UITextField) {

func textFieldDidEndEditing(_ textField: UITextField) {

我能够 运行 正确地编写代码。

我想知道添加 _ 作为参数之一会发生什么。这两种方法都不会导致编译错误。但是第一个确实给出了这样的警告:

ViewController.swift:35:10: Instance method 'textFieldDidEndEditing(textField:)' 
nearly matches optional requirement 'textFieldDidEndEditing' of protocol 'UITextFieldDelegate'

由于第一个是apple tutorial给的,不知道是不是写错了。有人可以澄清我的疑问吗?

我认为您使用的是 Swift 3.0。您正在学习的教程可能是 Swift 2.2 或 Swift 2.3 版本。这只不过是我所观察到的语法变化。即使我昨天更新到 Xcode 8.0

也遇到了这种情况

如果你想要多个没有外部名称的参数,你必须使用“_”下划线字符作为其外部名称:

来自Swift 3 第一个参数标签也是初始化程序的标准。

Swift3进化

First parameter declarations will match the existing behavior of the second and later parameters. All parameters, regardless of position, will behave uniformly. This will create a simple, consistent approach to parameter declaration throughout the Swift programming language and bring method and function declarations in-sync with initializers, which already use this standard.

例如

func foo(x: Int, y: Int) 

将声明 foo(x:y:) 而不是 foo(_:,y:)

现有的外部标签覆盖将继续应用于第一个参数。您在其支持的本地参数名称之前建立外部参数名称,并以 space 分隔。例如,

func foo(xx x: Int, yy y: Int) //declares foo(xx:yy:) and

func foo(_ x: Int, y: Int) //explicitly declares foo(_:y:)

阅读 SE-0046

中有关第一个参数的更多信息