1凝化、可選類型概念
可選類型
用來處理值可能缺失的情況介杆。
下面的例子嘗試將一個String
轉(zhuǎn)換成Int
:
let possibleNumber = "123
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測為類型"Int?"
可以給可選變量賦值為nil
來表示它沒有值:
var serverResponseCode: Int? = 404
serverResponseCode = nil
注意:
nil
不能用于非可選的常量和變量。如果代碼中有常量或者變量需要處理值缺失的情況,應(yīng)該聲明稱對應(yīng)的可選類型。
如果聲明一個可選常量或者變量但是沒有賦值柬批,它們會自動被設(shè)置為nil
:
var surveyAnswer: String?
// surveyAnswer 被自動設(shè)置為nil
可選類型可以用 ??
設(shè)置默認(rèn)值:
var s: String?
var s1 = s ?? "xx"
print(s1) // print "xx"
注意:
Swift中的nil
和Objective-C中的nil
不一樣。在OC中,nil
是一個指向不存在對象的指針氮帐。在Swift中锻霎,nil
不是指針——它是一個確定的值,用來表示值缺失揪漩。任何類型的可選狀態(tài)都可以被設(shè)置為nil
,不只是對象類型吏口。
2奄容、強(qiáng)制解析
當(dāng)你確定可選類型確實(shí)包含值之后,可以在可選的名字后面加一個感嘆號(!
)來強(qiáng)制解析獲取值产徊。
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
包含一個值,創(chuàng)建一個叫做actualNumber
的新常量并將可選包含的值賦給它舟铜。
4戈盈、隱式解析可選類型
有時(shí)候一個可選類型第一次被賦值后,可以確定它總會有值谆刨。在這種情況下塘娶,每次都要判斷和解析可選值是非常低效的。
這種類型的可選狀態(tài)被定義為隱式解析可選類型痊夭。把想要用作可選類型的后面的問號(String?
)改成感嘆號(String!
)來聲明一個隱式解析可選類型刁岸。
隱式解析可選類型主要被用在Swift中類的構(gòu)造過程中,請自行查閱相關(guān)資料她我。
下面的例子展示了可選類型和隱式解析可選類型之間的卻別:
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. 可選類型的鏈?zhǔn)饺≈?/h2>
傳統(tǒng)寫法:
var display: UILabel?
if let temp1 = display {
if let temp2 = temp1.text {
let x = temp2.hashValue
...
}
}
鏈?zhǔn)綄懛ǎ?/p>
if let x = display?.text?.hashValue {...} // x is an Int
let x = display?.text?.hashValue {...} // x is an Int