关于Swift中函数符号的问题

时间:2015-07-12 08:54:21

标签: swift

我正在学习Swift(遵循Apple的教程)并且我已经遇到过这种表示法:

optional func imagePickerController(_ picker: UIImagePickerController,
  didFinishPickingMediaWithInfo info: [String : AnyObject])

在这种情况下,_是什么意思? didFinishPickingMediaWithInfo和信息词典之间的关系是什么(显然它不是类型,因为它是在冒号之后提供的)?

2 个答案:

答案 0 :(得分:3)

定义函数或方法的参数时,除了类型之外,每个参数都必须有一个本地名称,它标识可从函数体中访问的变量的名称,但它也可以有一个外部名称,在调用函数时使用。

func doSomething(externalName internalName: Int) {
   print(internalName)
}

doSomething(externalName: 4)

代替外部名称的下划线表示没有为该参数定义外部名称。在上面的示例":

func doSomething(_ internalName: Int) {
   print(internalName)
}

它表示通过传递参数调用函数,而不用外部名称作为前缀:

doSomething(5)

外部名称有助于识别每个参数的用途,使代码更易于阅读。例如,比较一下:

update(33, 1, data)

用这个:

update(invoiceId: 33, itemId: 1, invoiceDetails: data)

由于它的实用性,Swift自动"促进"未明确指定时,外部名称​​的本地名称。在Swift 1.x中:

  • 所有全局函数都没有默认外部名称
  • 所有方法都包含所有参数,但第一个方法具有自动生成的外部名称
  • 所有初始值设定项都有自动生成的外部名称

在Swift 2.0中,全局函数遵循与方法相同的规则。

自动生成外部名称意味着例如这样的函数:

func updateInvoice(invoiceId: Int, invoiceDetailId: Int, invoiceDetail: data)

将其签名自动更新为:

func updateInvoice(invoiceId: Int, invoiceDetailId invoiceDetailId: Int, invoiceDetail invoiceDetail: data)
                                   ^^^^^^^^^^^^^^^                       ^^^^^^^^^^^^^

自动为第2和第3个添加外部名称(即第1个之后的所有参数)。

在你的情况下:

optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])

第一个下划线表示:不使用也不为此参数生成外部名称。对于第二个参数,在调用函数时它被引用为didFinishPickingMediaWithInfo,但它可以作为名为imagePickerController的变量用于info方法。

推荐阅读:Function Parameter Names

答案 1 :(得分:0)

查看此文章http://natashatherobot.com/swift-parameter-names-in-functions/

它解释了使用" _"的含义。在函数/方法签名中。