以下是我在游乐场的代码:
let aNumber : NSNumber? = nil
func testFuction() -> NSNumber!{
return aNumber
}
dump(testFuction())
输出:
- nil
我很困惑为什么它没有崩溃。返回值NSNumber!
显然为零,但它是强制解包的。这不应该崩溃吗?请解释一下。
答案 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!
}