Swift:Force Unwrapped返回nil而不会崩溃

时间:2016-06-20 22:07:06

标签: swift swift2 forced-unwrapping

以下是我在游乐场的代码:

let aNumber : NSNumber? = nil

func testFuction() -> NSNumber!{
    return aNumber
}

dump(testFuction())

输出:

- nil

我很困惑为什么它没有崩溃。返回值NSNumber!显然为零,​​但它是强制解包的。这不应该崩溃吗?请解释一下。

3 个答案:

答案 0 :(得分:2)

nil隐式解包选项会在解包时崩溃,并且将可选项传递给dump并不会解包它。将(隐式包装的)可选值(T!)作为展开类型(T)的值传递时会发生隐式展开,但如果函数接受可选,则不会发生展开。

您可以通过let unwrapped: NSNumber = testFunction()之类的操作进行隐式展开,这会崩溃。

如果你想强行打开这个值,感叹号会在值之后,而不是在返回类型之后:

func testFuction() -> NSNumber {
    return aNumber!
}

答案 1 :(得分:2)

您将返回一个隐式解包的可选项NSNumber!。返回的基础数据类型是可选的,但每次使用时都会自动解包。 Swift包含这种类型,因此您不必在某个点之后使用感叹号(例如,一个以nil开头但在它之前被初始化的实例变量)之后不必使用感叹号。用过的)。允许使用隐式解包的选项包含nil值,但如果在实际尝试使用它时变量为nil,则会触发运行时错误,因为它在使用时被强制解包。

答案 2 :(得分:1)

您的函数返回一个隐式解包的可选项。如果您尝试将其用作NSNumber,它将被隐式解包,但它仍然是可选的,因此它可以合法地具有nil值。

如果在aNumber之后添加感叹号并将其从函数返回类型中删除,则会出现预期的崩溃:

func testFuction() -> NSNumber {
    return aNumber!
}