我創建這樣的函數:Swift:可選的無效默認值?
func foo(bar: UInt? = 0) {
let doSomething = someOtherFunc(bar!)
}
如果我傳遞給foo()
一個nil
值,我期待的默認值0用於代替同時展開它,而是比我得到通常的錯誤unexpectedly found nil while unwrapping an Optional value
我在哪裏錯了?
我創建這樣的函數:Swift:可選的無效默認值?
func foo(bar: UInt? = 0) {
let doSomething = someOtherFunc(bar!)
}
如果我傳遞給foo()
一個nil
值,我期待的默認值0用於代替同時展開它,而是比我得到通常的錯誤unexpectedly found nil while unwrapping an Optional value
我在哪裏錯了?
的默認值= 0
如果的可選參數不提供參數 僅用於:
func foo(bar: UInt? = 0) {
println(bar)
}
foo(bar: nil) // nil
foo(bar: 1) // Optional(1)
foo() // Optional(0), default value used
如果你的目的是通過0
然後更換一個傳遞nil
值你ç一個使用未繳合併運算??
:
func foo(bar: UInt?) {
println(bar ?? 0)
}
foo(nil) // 0
foo(1) // 1
您正在將nil
傳遞給函數,但在函數內部,您強制使用!
解包值,因此它崩潰。
您應該使用if let x = y {
(或任何其他相關的技術),以防止這種情況:
func foo(bar: UInt? = 0) {
if let input = bar {
someOtherFunc(input)
}
}
func someOtherFunc(bar: UInt) {
println(bar)
}
foo(bar: 42) // Prints "42"
foo(bar: nil) // Does nothing
默認值是不是當nil
中通過了當主叫方不提供一個值默認值適用 - 也就是說,如果你叫你的功能foo()
。
如果要應用的默認值,當用戶通過在nil
,你應該使用未繳合併運算符,??
:
func foo(bar: UInt?) {
// bar replaced with 0 when it is nil, else it's unwrapped
let doSomething = someOtherFunc(bar ?? 0)
}
好吧,給你說的話,默認值是沒用,所以我還是不明白。如果我使用foo(bar:nil),它應該使用0默認值,而不是無所事事。 – Sylver
查看@ martin-r關於細節的出色答案。 :)(我沒有提供關於默認值的示例,只關於解包。) – Moritz