Swift基礎(chǔ)語法簡(jiǎn)介(三)——可選項(xiàng)

? 可以利用可選項(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))。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容