以下是我在操场上的代码:
let aNumber : NSNumber? = nil
func testFuction() -> NSNumber!{
return aNumber
}
dump(testFuction())
输出:
- nil
我很困惑为什么它没有崩溃。返回值NSNumber!
显然为零,但它被强制解包。这不应该崩溃吗?请解释。
以下是我在操场上的代码:
let aNumber : NSNumber? = nil
func testFuction() -> NSNumber!{
return aNumber
}
dump(testFuction())
输出:
- nil
我很困惑为什么它没有崩溃。返回值NSNumber!
显然为零,但它被强制解包。这不应该崩溃吗?请解释。
nil
隐式展开选项在展开时会崩溃,并且将选项传递给dump
不会展开它。当您将(隐式包装的)可选值(T!)作为未包装类型(T)的值传递时,会发生隐式展开,但如果函数接受可选值,则不会发生展开。
您可以通过执行类似的操作来进行隐式展开let unwrapped: NSNumber = testFunction()
,这会崩溃。
如果您打算强制解开该值,感叹号会在值之后,而不是在返回类型之后:
func testFuction() -> NSNumber {
return aNumber!
}
您正在返回一个隐式展开的可选,NSNumber!
. 返回的基础数据类型是可选的,但每次使用时都会自动解包。Swift 包含这种类型,因此您不必在变量之后使用感叹号,您知道在某个点之后将是非 nil(例如,一个实例变量以 nil 开始,但在使用之前被初始化) . 隐式展开的选项允许包含 nil 值,但如果变量为 nil 时,您将在实际尝试使用它时触发运行时错误,因为它在使用时被强制展开。
您的函数返回一个隐式展开的可选项。如果您尝试将其用作 ,它将被隐式解包NSNumber
,但它仍然是可选的,因此它可以合法地具有nil
价值。
如果你在函数返回类型后面加上一个感叹号aNumber
并将其从函数返回类型中删除,你会如预期的那样崩溃:
func testFuction() -> NSNumber {
return aNumber!
}