說我有這樣的默認參數後有非默認參數的函數:斯威夫特:使用默認參數功能之前,非默認參數
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