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

时间:2014-06-08 04:14:52

标签: swift

说我有一个函数,在默认参数之后有非默认参数,如下所示:

func f(first:Int = 100, second:Int){}

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

4 个答案:

答案 0 :(得分:69)

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

screenshot of Playground

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

f(1)

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

f(first: 3, 1)

文档explains表示具有默认值的参数会自动赋予外部名称:

  

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

答案 1 :(得分:17)

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

func f(second:Int, first:Int = 100){}
f(10)
  

在函数末尾放置带默认值的参数   参数列表。这可以确保对函数的所有调用都使用   他们的非默认参数的顺序相同,并明确表示   在每种情况下都会调用相同的函数。

Documentation link

答案 2 :(得分:4)

在Swift 3上:

func defaultParameterBefore(_ x: Int = 1, y: Int ) {}

调用

defaultParameterBefore(2)

会引发此错误

error: missing argument for parameter 'y' in call

唯一的例外是:

  • 默认参数之前有一个参数;
  • 默认参数后面的参数是闭包;
  • 闭包参数是最后一个参数;
  • 通过尾随关闭调用

例如:

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) }

swift version DEVELOPMENT-SNAPSHOT-2016-04-12

答案 3 :(得分:0)

如果它是类的方法,则需要像这样调用它

class Test
{
    func f(first:Int = 100, second:Int)
    {
        println("first is \(first)")
        println("second is \(second)")
    }

    func other()
    {
        f(second: 4)
        f(first: 30, second: 5)
        //f(4) will not compile, and neither will f(9,12)
    }
}

如果函数f是全局函数,则需要像这样调用它:

f(4)
f(first: 30, 5)

打印:

first is 100
second is 4
first is 30
second is 5