展开可选项

为了访问 Optional 的值,需要将其解包。

你可以使用可选绑定有条件地打开 Optional,并使用 ! 操作符强制打开 Optional。

有条件地展开有效地询问“这个变量是否有价值?” 虽然强行展开说“这个变量有价值!”。

如果你强制打开一个 nil 变量,程序将在解开可选异常并崩溃抛出意外发现的 nil ,因此你需要仔细考虑是否使用 !

var text: String? = nil
var unwrapped: String = text! //crashes with "unexpectedly found nil while unwrapping an Optional value"

为了安全展开,你可以使用 if-let 语句,如果包装的值为 nil,则不会抛出异常或崩溃:

var number: Int?
if let unwrappedNumber = number {       // Has `number` been assigned a value?
    print("number: \(unwrappedNumber)") // Will not enter this line
} else {
    print("number was not assigned a value")
}

或者,一份警卫声明

var number: Int?
guard let unwrappedNumber = number else {
    return
}
print("number: \(unwrappedNumber)")

请注意,unwrappedNumber 变量的范围在 if-let 语句内,在 guard 块之外。

你可以链接展开许多可选项,这在代码需要更多变量才能正确运行的情况下非常有用:

var firstName:String?
var lastName:String?

if let fn = firstName, let ln = lastName {
    print("\(fn) + \(ln)")//pay attention that the condition will be true only if both optionals are not nil.
}

请注意,为了成功通过测试,必须解开所有变量,否则你将无法确定哪些变量被解包而哪些变量未被解包。

你可以在解包后立即使用你的选项链接条件语句。这意味着没有嵌套的 if - else 语句!

var firstName:String? = "Bob"
var myBool:Bool? = false

if let fn = firstName, fn == "Bob", let bool = myBool, !bool {
    print("firstName is bob and myBool was false!")
}