首先让我们定义一个 Optional
Optional 值是某种类型的容器( Int
, String
, UIColor
, ...),它可以包含值 ( 1
, "Hello world"
, .greenColor()
, ...) 或nil
.
let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
在 Swift 中,我们看到一个 Optional 值,我们认为:
好的,这可能包含实际值或nil
强制展开
这是提取包含在Optional
. 这个操作很危险,因为你在告诉编译器:我确定这个 Optional 值确实包含一个真实值,提取它!
let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
现在anInt
包含值 1。
如果我们对碰巧包含nil
我们得到 a的 Optional 值执行强制解包fatalError
,则应用程序确实会崩溃并且无法恢复它。
let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!
fatal error: unexpectedly found nil while unwrapping an Optional value
隐式展开的选项
当我们定义一个隐式展开的可选时,我们定义了一个容器,每次我们读取它时都会自动执行强制展开。
var text: String! = "Hello"
如果现在我们读text
let name = text
我们得到的不是 OptionalString
而是普通的String
,因为text
它的内容是自动展开的。
但是 text 仍然是一个可选的,所以我们可以在nil
里面放一个值
text = nil
但是一旦我们阅读它(并且它包含nil
),我们就会得到一个致命错误,因为我们正在解开一个可选的包含nil
let anotherName = text
fatal error: unexpectedly found nil while unwrapping an Optional value