Swift:在非默认参数之前使用默认参数

Car*_*loS 45 swift

假设我有一个在默认参数后面有非默认参数的函数,如下所示:

func f(first:Int = 100, second:Int){}
Run Code Online (Sandbox Code Playgroud)

如何调用它并使用第一个参数的默认值?

nat*_*han 71

当前编译器允许在参数列表中间使用默认参数.

Playground的截图

如果要使用first参数的默认值,可以像这样调用函数:

f(1)
Run Code Online (Sandbox Code Playgroud)

如果要为first参数提供新值,请使用其外部名称:

f(first: 3, 1)
Run Code Online (Sandbox Code Playgroud)

该文档说明具有默认值的参数会自动赋予外部名称:

如果您不自己提供外部名称,Swift会为您定义的任何默认参数提供自动外部名称.自动外部名称与本地名称相同,就像您在代码中的本地名称之前编写了哈希符号一样.

  • @Rafael 我没有说这是最佳做法;我正确回答了这个问题。因此,这应该是公认的答案。 (2认同)

Con*_*nor 18

您应该在参数列表的末尾有默认参数.

func f(second:Int, first:Int = 100){}
f(10)
Run Code Online (Sandbox Code Playgroud)

将参数的默认值放在函数的参数列表的末尾.这可以确保对函数的所有调用对其非默认参数使用相同的顺序,并清楚地表明在每种情况下都调用相同的函数.

文档链接


wea*_*ish 5

在 Swift 3 上:

func defaultParameterBefore(_ x: Int = 1, y: Int ) {}
Run Code Online (Sandbox Code Playgroud)

打电话

defaultParameterBefore(2)
Run Code Online (Sandbox Code Playgroud)

会引发这个错误

error: missing argument for parameter 'y' in call
Run Code Online (Sandbox Code Playgroud)

唯一的例外是:

  • 默认参数前有一个参数;
  • 并且默认参数后面的参数是一个闭包;
  • 封闭参数是最后一个parametr;
  • 通过尾随闭包调用

例如:

func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) {
    if y {
       print(x)
    } else
       z()
    }
}

// error: missing argument for parameter #3 in call
// defaultParameterWithTrailingClosure(1, { print(0) }

// Trailing closure does work, though.
func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true,
                                     _ z: () -> Void) {
    if y {
        print(x)
    } else {
        z()
    }
}

defaultParameterWithTrailingClosure(1) { print(0) }
Run Code Online (Sandbox Code Playgroud)

快速版本DEVELOPMENT-SNAPSHOT-2016-04-12

  • 您的代码示例不起作用。z 应该是一个闭包 `() -> String`,而不是一个 `String` 吗? (2认同)