Swift: 强制展开 returns nil 而不会崩溃

Swift: Force Unwrapped returns nil without crashing

下面是我在操场上的代码:

let aNumber : NSNumber? = nil

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

dump(testFuction())

输出:

- nil

我很困惑为什么它没有崩溃。 return 值 NSNumber! 显然是 nil,但它被强制解包了。这不应该崩溃吗?请解释。

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

如果你在 aNumber 后面加上感叹号并将其从函数 return 类型中删除,你会如预期的那样崩溃:

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

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

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

如果您打算强制解包该值,感叹号位于该值之后,而不是在 return 类型之后:

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

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