2015-04-14 54 views
3

我創建這樣的函數:Swift:可選的無效默認值?

func foo(bar: UInt? = 0) { 
    let doSomething = someOtherFunc(bar!) 
} 

如果我傳遞給foo()一個nil值,我期待的默認值0用於代替同時展開它,而是比我得到通常的錯誤unexpectedly found nil while unwrapping an Optional value

我在哪裏錯了?

回答

8

的默認值= 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 
2

您正在將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 
+0

好吧,給你說的話,默認值是沒用,所以我還是不明白。如果我使用foo(bar:nil),它應該使用0默認值,而不是無所事事。 – Sylver

+0

查看@ martin-r關於細節的出色答案。 :)(我沒有提供關於默認值的示例,只關於解包。) – Moritz

3

默認值是不是當nil中通過了當主叫方不提供一個值默認值適用 - 也就是說,如果你叫你的功能foo()

如果要應用的默認值,當用戶通過在nil,你應該使用未繳合併運算符,??

func foo(bar: UInt?) { 
    // bar replaced with 0 when it is nil, else it's unwrapped 
    let doSomething = someOtherFunc(bar ?? 0) 
}