【问题标题】:What is _: in Swift telling me?什么是 _: 在 Swift 中告诉我?
【发布时间】:2015-06-16 19:04:11
【问题描述】:

函数定义中唯一的下划线是什么意思?

例如map(_:)

我知道在定义函数时我可以做:

func myFunc(_ string: String) { ... }

然后我是否可以将其称为myFunc(_:) 而不是myFunc(_string:),即故意隐藏参数名称?

【问题讨论】:

  • 值得一读:Swift 3 对函数/方法参数名称和参数标签的使用和命名方式进行了一些更改。这是函数中的_underscores,非常清晰:stackoverflow.com/questions/24437388/…

标签: swift


【解决方案1】:

_用于定义参数未命名

如果您有多个_,则表明您不需要在函数调用中命名参数

func myFunc(name:String, _ age:String){
}

myFunc(“Milo", "I'm a really old wizard")

如果你不使用下划线,你会使用

myFunc(“Milo”, age: "I'm a really old wizard")

函数调用不需要_。它只是用来表示某些东西不需要有名字。

关于如何引用函数,您不必为函数调用传递任何名称。
但是由于您也没有定义参数类型,这在我看来是一个无效的示例(它至少在带有 Swift 2.0 的 Xcode 7 中不起作用)

编辑:
从 Swift 3.0 开始

myFunc(name: “Milo”, age: "I'm a really old wizard")

应该使用

【讨论】:

  • 我是 swift 2.0 的新手。我看到您在这两种情况下都没有对第一个参数使用下划线。那么你是否也应该在函数调用中像这样声明 name:myFunc(name: "Milo", age: "I'm a really old wizard") ?
【解决方案2】:

Swift 需要一个约定来说明函数的名称是什么,不仅包括函数名称本身(括号之前),还包括参数的外部名称。约定是名称后跟冒号。所以这是一个函数声明(在 Swift 2.0 中):

func myFunc(param1 param1:String, param2:String, param3:String) {}

这是该函数的名称:

myFunc(param1:param2:param3:)

然而,在现实生活中,有可能(确实很可能)一个或多个参数不会外化任何名称。因此,我们需要该名称的占位符。下划线是占位符 - 就像下划线是声明中抑制名称外部化的符号一样。所以,这是另一个函数声明(在 Swift 2.0 中):

func myFunc2(param1:String, _ param2:String, _ param3:String) {}

这是该函数的名称:

myFunc2(_:_:_:)

[Swift 2.0 规范在这里很重要。在 Swift 2.0 中,第一个参数名称总是默认外部化,而其他参数名称​​默认外部化。在 Swift 1.2 及之前的版本中,外部化规则取决于声明出现的位置,这是不必要的不​​一致和混乱。]

【讨论】:

  • 在第一个声明中,您没有为第二个和第三个参数指定外部名称,也没有使用#。那么它真的应该被称为你所拥有的,还是因为它是默认外部化的所以它是正确的? -- 如果是,那么 # 是否不再需要?
  • @Alex 您是否阅读了我答案底部的注释?我正在描述 Swift 2.0 的情况。 # 在 Swift 2.0 中消失了。
  • 我确实读过它,但我在试图将 2.0 与 1.2 联系起来时感到困惑,而我不应该这样做。你说的有道理,这次我得重读2.0的指南。 @马特
  • 你不能在 Swift 1.2 中给一个孤立的函数一个一致的名字,因为你不知道它的参数将如何被外部化。
  • 值得一读:Swift 3 对函数/方法参数名称和参数标签的使用和命名方式进行了一些更改。这是函数中的_underscores,非常清晰:stackoverflow.com/questions/24437388/…
【解决方案3】:

当引用一个函数时,为了消除歧义,有必要提供函数名称以及它所期望的任何参数的外部名称。

例如,

func myFunc(myString string: String) { ... }

func myFunc(_ string: String) { ... }

表示两个不同的函数,一个在调用函数时为第一个String参数提供外部标签,另一个不使用标签,如:

myFunc(myString: "hi")

myFunc("hi")

因此,为了识别函数,我们为每个参数添加了外部标签,其中 ':' 表示要提供参数 - 例如yourFunc(arg1:arg2:) 将接受 2 个参数。

当没有使用外部标签时,我们放置一个下划线('_')。

对于上面给出的 2 个函数,我们将使用以下方法唯一标识它们:

myFunc(myString:)myFunc(_:)

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 2012-10-25
    • 2016-04-19
    • 2014-09-12
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多