0

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

let aNumber : NSNumber? = nil

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

dump(testFuction())

输出:

- nil

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

4

3 回答 3

2

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

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

如果您打算强制解开该值,感叹号会在值之后,而不是在返回类型之后:

func testFuction() -> NSNumber {
    return aNumber!
}
于 2016-06-20T22:09:33.390 回答
2

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

于 2016-06-20T22:13:37.863 回答
1

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

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

func testFuction() -> NSNumber {
    return aNumber!
}
于 2016-06-20T22:09:33.187 回答