说我有这样的默认参数后有非默认参数的函数:斯威夫特:使用默认参数功能之前,非默认参数
func f(first:Int = 100, second:Int){}
我如何可以调用它并使用默认值的第一个参数?
说我有这样的默认参数后有非默认参数的函数:斯威夫特:使用默认参数功能之前,非默认参数
func f(first:Int = 100, second:Int){}
我如何可以调用它并使用默认值的第一个参数?
目前的编译器允许在参数列表中的默认参数。
你可以这样调用的函数,如果你想使用的默认值的first
参数:
f(1)
如果你想为first
参数,利用提供了新的价值其外部名称:
f(first: 3, 1)
该文档explains表示参数wit h默认值会自动给出一个外部名称:
如果您自己没有提供外部名称,Swift将为您定义的任何默认参数提供一个自动外部名称。自动外部名称与本地名称相同,就像您在代码中的本地名称之前写入了散列符号一样。
您应该在参数列表的末尾有默认参数。
func f(second:Int, first:Int = 100){}
f(10)
将参数与函数的参数 列表的末尾默认值。这可以确保所有对该函数的调用都使用 相同的顺序作为它们的非默认参数,并且清楚地表明 在每种情况下都调用了相同的函数。
所以使用参数有一个默认值那些没有以前是没有意义的?为什么不是编译时错误? – CarmeloS
不,它不是毫无意义的,它不是“确保所有对该函数的调用都使用相同的顺序作为其非默认参数”。它会工作,但可能会令人困惑。因此,Apple为开发人员定义了将参数置于默认值的指南。 –
如果它是一个类的方法,你需要调用它像这样
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
在斯威夫特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) }
迅速版:
例如调用DEVELOPMENT-SNAPSHOT-2016-04-12
尽管这个答案在技术上是正确的,并且你可以在Swift中这样做,但它很混乱,应该避免。重构函数以在最后使用默认参数并不是那么有用。即使在这种简单的情况下,对f(1)的调用意味着什么也不完全清楚。 [@康纳的回答](http://stackoverflow.com/a/24102938/133166)应该是可以接受的。 –
@Rafael我没有说这是最好的做法;我正确回答了这个问题。因此,这应该是被接受的答案。 – nathan
@Rafael Swift 3'f(1)'会导致错误。 – weakish