? 可以利用可選項(xiàng)來處理值可能缺失的情況??蛇x項(xiàng)意味著:這里有一個(gè)值,它等于X或者這里根本沒有值。
? 在C和Objective-C中,沒有可選項(xiàng)的概念。在Objective-C中有一個(gè)近似的特性,一個(gè)方法可以返回一個(gè)對(duì)象或者返回nil。nil的意思是“缺少一個(gè)可用對(duì)象”。然而,他只能用在對(duì)象上,卻不能作用在結(jié)構(gòu)體,基礎(chǔ)的C類型和枚舉值上。對(duì)于這些類型,Objective-C會(huì)返回一個(gè)特殊的值(例如NSNotFound)來表示值的缺失。這種方法是建立在假設(shè)調(diào)用者知道這個(gè)特殊的值并記得去檢查他。然而,Swift中的可選項(xiàng)就可以讓你知道任何類型的值的缺失,他并不需要一個(gè)特殊的值。
? 你可以通過給可選變量賦值一個(gè)nil來將之設(shè)置為沒有值:
var serverResponseCode: Int? = 404
// serverResponseCode contains an actualInt value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
? nil不能用于非可選的常量或者變量,如果你的代碼中常量或變量需要作用于特定條件下的值缺失,可以給它聲明為相應(yīng)類型的可選項(xiàng)。
如果你定義的可選變量沒有提供一個(gè)默認(rèn)值,變量會(huì)被自動(dòng)設(shè)置成nil。
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
?Swift中的nil和Objective-C中的nil不同,在Objective-C中nil是一個(gè)指向不存在對(duì)象的指針。在Swift中,nil不是指針?biāo)侵等笔У囊环N特殊類型,任何類型的可選項(xiàng)都可以設(shè)置成nil而不僅僅是對(duì)象指針。
1、強(qiáng)制展開
if helloMessage != nil {
print("convertedNumberhas an integer value of \( helloMessage!).")
}
一旦確定可選變值中包含值,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來獲取值,感嘆號(hào)的意思就是說“我知道這個(gè)可選項(xiàng)里面有值,展開吧”。這就是所謂的可選值的強(qiáng)制展開。使用!?來獲取一個(gè)不存在的可選值會(huì)導(dǎo)致運(yùn)行錯(cuò)誤,在使用!強(qiáng)制展開之前必須確??蛇x項(xiàng)中包含一個(gè)非nil?的值。
2、可選項(xiàng)綁定
? 可以使用可選項(xiàng)綁定來判斷可選項(xiàng)是否包含值,如果包含就把值付給一個(gè)臨時(shí)的常量或者變量。可選綁定可以與if和while的語句使用來檢查可選項(xiàng)內(nèi)部的值,并賦值給一個(gè)常量或者變量。
if let?constantName = someOptional{
print("constantName is\(constantName)")?? // constantName只能在if語句內(nèi)用
}
? 你可以在同一個(gè)if語句中包含多可選項(xiàng)綁定,用逗號(hào)分割即可。如果任一可選綁定結(jié)果是nil或者布爾值為false,那么整個(gè)if判斷會(huì)被看做false。
if let firstNumber = Int("4"), letsecondNumber = Int("42"), firstNumber < secondNumber && secondNumber< 100 {
print("\(firstNumber)< \(secondNumber) < 100")
}
3、隱式展開可選項(xiàng)
? 通過在聲明的類型后邊添加一個(gè)嘆號(hào)(String!)而非問號(hào)(String?)來書寫隱式展開可選項(xiàng)。
let possibleString: String? = "Anoptional string."
let forcedString: String = possibleString! //requires an exclamation mark
let assumedString: String! = "Animplicitly unwrapped optional string."
let implicitString: String = assumedString //no need for an exclamation mark
? 隱式展開可選項(xiàng)其實(shí)就是在每次訪問該值的時(shí)候賦予了自動(dòng)展開的權(quán)限(即自動(dòng)執(zhí)行了感嘆號(hào)的功能(!))。你可以在聲明可選項(xiàng)的時(shí)候添加一個(gè)嘆號(hào)而不是每次調(diào)用的時(shí)候再可選項(xiàng)后添加嘆號(hào)。當(dāng)然,前提是該可選值有值。隱式展開可選項(xiàng)主要被用在Swift類的初始化過程中(初始化的時(shí)候被賦值,之后會(huì)一直保持有值的狀態(tài))。