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)
printsOptional(5)
whileprint(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)
printsOptional(5)
而print(y)
打印5
。因此x
不会展开,并且