为什么我需要复制第一个参数的标签以使其显示在调用中?

Why do I need to duplicate the first parameter's label to make it show up in calls?

我有这两个功能:

func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
            // here
func random(min min: CGFloat, max: CGFloat) -> CGFloat {
    return random() % (max - min) + min
}

为什么我要在第二个函数中写两次 min 以便这样调用它:

random(min: 1, max: 5);

从函数中删除第二分钟。顺便说一句,当你调用一个函数时,跳过第一个变量名,只输入值。这是调用函数的swift语法

  func random(min: CGFloat, max: CGFloat) -> CGFloat {
      return random() % (max - min) + min
  }

  func random() -> CGFloat {
      return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
  }

  random(1, max: 5)

在 Swift3 之前,这是必要的。像这样声明一个函数:

func foo(bar: Baz)

隐式更改为:

func foo(_ bar: Baz)

这会让它像这样被调用:

foo(Baz())

所以必须这样声明:

func foo(bar bar: Baz)

为了这样称呼它:

foo(bar: Baz())

从Swift3开始,就没有必要了。现在,像这样声明一个函数:

func foo(bar: Baz)

隐式更改为:

func foo(bar bar: Baz)

这会让它像这样被调用:

foo(bar: Baz())

所以现在必须这样声明:

func foo(_ bar: Baz)

为了这样称呼它:

foo(Baz())

为什么?

这个想法是每个非自我记录的参数都必须有一个明确的标签,以便阅读代码的人立即知道发生了什么。对于像 setWidth(5) 这样的简单方法,很明显您将宽度设置为 5,因此第一个参数不需要标签(setWidth(width: 5) 是多余的)。但是,对于像 wait(forSeconds: 5) 这样更细微的方法,如果没有 forSeconds: 标签,则不清楚 5 的含义(wait(5) 很容易被视为 5 毫秒)。