Swift:Optional的无用默认值?

时间:2015-04-14 18:03:09

标签: swift optional

我正在创建一个这样的函数:

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

如果我传递给foo()一个nil值,我希望在打开它时使用默认值0,而不是我得到通常的错误unexpectedly found nil while unwrapping an Optional value

我在哪里错了?

3 个答案:

答案 0 :(得分:8)

默认值= 0仅在您不提供参数时使用 对于可选参数:

func foo(bar: UInt? = 0) {
    println(bar)
}

foo(bar: nil) // nil
foo(bar: 1)   // Optional(1)
foo()         // Optional(0), default value used

如果您打算用nil替换已传递的0值 然后你可以使用nil-coalescing运算符??

func foo(bar: UInt?) {
    println(bar ?? 0)
}

foo(nil) // 0
foo(1)   // 1

答案 1 :(得分:3)

默认值不适用于传入nil的时间。默认值适用于调用者未提供值的情况 - 也就是说,如果您将函数调用为foo()

如果您希望在用户传入nil时应用默认值,则应使用nil-coalescing运算符??

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

答案 2 :(得分: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