可选展开nil并不总是致命错误

时间:2018-02-20 23:07:52

标签: swift optional

为什么这段代码会给我一个致命错误

var number: Int? = .none
print(number!)

Fatal error: Unexpectedly found nil while unwrapping an Optional value

但这段代码没有?

var number: Int! = .none
print(number)

nil

不是Int!在使用时自动解包变量?为什么在打印数字时不会抛出致命错误?

2 个答案:

答案 0 :(得分:1)

Optional是一种可以包含或不包含值的类型。

在第一种情况下,您在代码中告诉numbers包含Int变量(这是因为numbers!),这是一种非常不安全的工作方式Optionals。当你打开numbers时,它必须包含一个值,或者相​​反,它必须不是nil。由于编译器实际上发现没有Int值而是nil,因此它会调用致命错误。

在第二种情况下,您只是打印一个Optional,它可以包含或不包含Int值。在这种特定情况下,它不会保留Int值,因此会打印nil

您可以在Optionals找到更多信息: https://developer.apple.com/documentation/swift/optional

答案 1 :(得分:0)

隐蔽的未解决的选择权仍然是引擎盖下的选择;他们只是根据需要自动解开。

但是,print函数接受可选值,因此不需要将其展开。在第一种情况下,你得到一个错误,因为你明确地解开它,但在第二种情况下,它很高兴保持它包装,所以没有错误。对于其他接受选项的函数,它也会像那样工作,但如果你在某个地方使用它,那么一个可选项不起作用,那么它会强制解包并且两者的行为都变得相同:

let num1: Int! = nil
let num2: Int? = nil

print(String(describing: num1)) // works fine
print(String(describing: num2!)) // error

print(num1 + 1) // error
print(num2! + 1) // also error