Swift中的可選類型

1、可選類型概念

可選類型用來處理值可能缺失的情況。

下面的例子嘗試將一個String轉換成Int:

let possibleNumber = "123
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測為類型"Int?"

可以給可選變量賦值為nil來表示它沒有值:

var serverResponseCode: Int? = 404
serverResponseCode = nil

注意:
nil不能用于非可選的常量和變量。如果代碼中有常量或者變量需要處理值缺失的情況,應該聲明稱對應的可選類型。

如果聲明一個可選常量或者變量但是沒有賦值,它們會自動被設置為nil:

var surveyAnswer: String?
// surveyAnswer 被自動設置為nil

可選類型可以用 ?? 設置默認值:

var s: String?
var s1 = s ?? "xx"
print(s1) // print "xx"

注意:
Swift中的nil和Objective-C中的nil不一樣。在OC中,nil是一個指向不存在對象的指針。在Swift中,nil不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為nil,不只是對象類型。

2、強制解析

當你確定可選類型確實包含值之后,可以在可選的名字后面加一個感嘆號(!)來強制解析獲取值。

if  convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber).")
}

3、可選綁定

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 輸出 "'123' has an integer value of 123"

如果Int(possibleNumber)返回的可選Int包含一個值,創建一個叫做actualNumber的新常量并將可選包含的值賦給它。

4、隱式解析可選類型

有時候一個可選類型第一次被賦值后,可以確定它總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的。

這種類型的可選狀態被定義為隱式解析可選類型。把想要用作可選類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選類型。

隱式解析可選類型主要被用在Swift中類的構造過程中,請自行查閱相關資料。

下面的例子展示了可選類型和隱式解析可選類型之間的卻別:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString!
// 需要感嘆號來獲取值

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString
// 不需要感嘆號

注意:
如果一個變量之后可能變成nil的話不要使用隱式解析可選類型。如果需要在變量的聲明周期中判斷是否是nil的話,使用普通可選類型。

5. 可選類型的鏈式取值

傳統寫法:

var display: UILabel?
if let temp1 = display {
    if let temp2 = temp1.text {
        let x = temp2.hashValue
        ...
    }
}

鏈式寫法:

if let x = display?.text?.hashValue {...} // x is an Int
   let x = display?.text?.hashValue {...} // x is an Int
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容