我创建这样的函数: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