展開可選項

為了訪問 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!")
}