展開可選項
為了訪問 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!")
}