? 可以利用可選項來處理值可能缺失的情況」⒚迹可選項意味著:這里有一個值,它等于X或者這里根本沒有值须眷。
? 在C和Objective-C中竖瘾,沒有可選項的概念。在Objective-C中有一個近似的特性花颗,一個方法可以返回一個對象或者返回nil捕传。nil的意思是“缺少一個可用對象”。然而扩劝,他只能用在對象上庸论,卻不能作用在結(jié)構(gòu)體,基礎(chǔ)的C類型和枚舉值上棒呛。對于這些類型聂示,Objective-C會返回一個特殊的值(例如NSNotFound)來表示值的缺失。這種方法是建立在假設(shè)調(diào)用者知道這個特殊的值并記得去檢查他簇秒。然而鱼喉,Swift中的可選項就可以讓你知道任何類型的值的缺失,他并不需要一個特殊的值趋观。
? 你可以通過給可選變量賦值一個nil來將之設(shè)置為沒有值:
var serverResponseCode: Int? = 404
// serverResponseCode contains an actualInt value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
? nil不能用于非可選的常量或者變量扛禽,如果你的代碼中常量或變量需要作用于特定條件下的值缺失,可以給它聲明為相應(yīng)類型的可選項皱坛。
如果你定義的可選變量沒有提供一個默認(rèn)值编曼,變量會被自動設(shè)置成nil。
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
?Swift中的nil和Objective-C中的nil不同剩辟,在Objective-C中nil是一個指向不存在對象的指針掐场。在Swift中,nil不是指針?biāo)侵等笔У囊环N特殊類型贩猎,任何類型的可選項都可以設(shè)置成nil而不僅僅是對象指針熊户。
1、強制展開
if helloMessage != nil {
print("convertedNumberhas an integer value of \( helloMessage!).")
}
一旦確定可選變值中包含值融欧,你可以在可選的名字后面加一個感嘆號(!)來獲取值敏弃,感嘆號的意思就是說“我知道這個可選項里面有值卦羡,展開吧”噪馏。這就是所謂的可選值的強制展開。使用!?來獲取一個不存在的可選值會導(dǎo)致運行錯誤绿饵,在使用!強制展開之前必須確鼻飞觯可選項中包含一個非nil?的值。
2拟赊、可選項綁定
? 可以使用可選項綁定來判斷可選項是否包含值刺桃,如果包含就把值付給一個臨時的常量或者變量∥睿可選綁定可以與if和while的語句使用來檢查可選項內(nèi)部的值瑟慈,并賦值給一個常量或者變量桃移。
if let?constantName = someOptional{
print("constantName is\(constantName)")?? // constantName只能在if語句內(nèi)用
}
? 你可以在同一個if語句中包含多可選項綁定,用逗號分割即可葛碧。如果任一可選綁定結(jié)果是nil或者布爾值為false借杰,那么整個if判斷會被看做false。
if let firstNumber = Int("4"), letsecondNumber = Int("42"), firstNumber < secondNumber && secondNumber< 100 {
print("\(firstNumber)< \(secondNumber) < 100")
}
3进泼、隱式展開可選項
? 通過在聲明的類型后邊添加一個嘆號(String!)而非問號(String?)來書寫隱式展開可選項蔗衡。
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
? 隱式展開可選項其實就是在每次訪問該值的時候賦予了自動展開的權(quán)限(即自動執(zhí)行了感嘆號的功能(!))。你可以在聲明可選項的時候添加一個嘆號而不是每次調(diào)用的時候再可選項后添加嘆號乳绕。當(dāng)然绞惦,前提是該可選值有值。隱式展開可選項主要被用在Swift類的初始化過程中(初始化的時候被賦值洋措,之后會一直保持有值的狀態(tài))济蝉。