2015-04-14 58 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) 
}