为什么这段代码会给我一个致命错误
var number: Int? = .none
print(number!)
Fatal error: Unexpectedly found nil while unwrapping an Optional value
但这段代码没有?
var number: Int! = .none
print(number)
nil
不是Int!在使用时自动解包变量?为什么在打印数字时不会抛出致命错误?
答案 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