Swift:Force Unwrapped返回零而不崩溃

Swift:Force Unwrapped返回零而不崩溃,swift,swift2,forced-unwrapping,Swift,Swift2,Forced Unwrapping,以下是我在操场上的代码: let aNumber : NSNumber? = nil func testFuction() -> NSNumber!{ return aNumber } dump(testFuction()) 输出: - nil 我不明白为什么它没有崩溃。返回值NSNumber显然为零,但它正在被强制展开。这不是应该崩溃吗?请解释。您的函数返回隐式展开的可选值。如果您尝试将其用作NSNumber,它将被隐式展开,但它仍然是可选的,因此它可以合法地具有nil值

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

let aNumber : NSNumber? = nil

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

dump(testFuction())
输出:

- nil

我不明白为什么它没有崩溃。返回值
NSNumber显然为零,但它正在被强制展开。这不是应该崩溃吗?请解释。

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

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

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

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

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

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

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

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

如果要强制展开该值,感叹号将位于该值之后,而不是返回类型之后:

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

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

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

如果要强制展开该值,感叹号将位于该值之后,而不是返回类型之后:

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

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

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

使用
print
而不是
dump
会按预期崩溃。使用
print
而不是
dump
会按预期崩溃。请详细说明“每次使用它时,它都会自动展开”。我的印象是
func testFuction()->NSNumber!
是否在返回值之前强制展开它?@user1107173,要强制展开一个值,需要在值后面加上感叹号,而不是在函数的返回类型后面。那么,函数中是否有一个点在返回一个函数签名中带有“砰”的值?”它将在每次使用时自动展开”--假设您有
var x:Int?=5
var y:Int!=5
。然后
print(x)
prints
Optional(5)
while
print(y)
打印
5
。因此
x
不是展开的,是一个正常的可选选项,而
y
在打印前是展开的,所以只打印
5
y
始终假定为非零,因此展开时不显式使用感叹号。
func testFuction()->NSNumber!
返回隐式展开的NSNumber可选值,但在使用它之前,返回值不会发生任何变化(如上例中的
y
)。事实上,在实际使用中,返回隐式展开的可选项几乎没有意义;返回true可选项,或返回非可选项并强制展开函数体中的返回值。返回隐式展开的可选项可能会使调试更加困难,因为您没有发现您已将nil包装在隐式u中nwrapped可选,直到您尝试使用返回值。能否请您详细说明“每次使用它时它都会自动展开”。我的印象是
func testFuction()->NSNumber!
是否在返回值之前强制展开它?@user1107173,要强制展开一个值,需要在值后面加上感叹号,而不是在函数的返回类型后面。那么,函数中是否有一个点在返回一个函数签名中带有“砰”的值?”它将在每次使用时自动展开”--假设您有
var x:Int?=5
var y:Int!=5
。然后
print(x)
prints
Optional(5)
print(y)
打印
5
。因此
x
不会展开,并且