Swift程式語言學習1 6 可選值

2022-09-08 16:48:26 字數 3570 閱讀 4322

可選值

使用可選(optionals)來處理值可能缺失的情況。可選表示:

有值,等於 x   或者沒有值

注意:c 和 objective-c 中並沒有可選這個概念。最接近的是 objective-c 中的乙個特性,乙個方法要不返回乙個物件要不返回nil,nil表示「缺少乙個合法的物件」。

然而,這僅僅對物件起作用——對於結構體。主要的 c 型別或者列舉型別不起作用。

對於這些型別,objective-c 方法通常會返回乙個特殊值(比方nsnotfound)來暗示值缺失。這樣的方法假設方法的呼叫者知道並記得對特殊值進行推斷。然而,swift 的可選能夠讓你暗示隨意型別的值缺失。並不須要乙個特殊值。

來看乙個樣例。

swift 的string型別有乙個叫做toint的方法。作用是將乙個string值轉換成乙個int值。然而,並非全部的字串都能夠轉換成乙個整數。字串"123"能夠被轉換成數字123。可是字串"hello, world"不行。

以下的樣例使用toint方法來嘗試將乙個string轉換成int:

let possiblenumber = "123"

let convertednumber = possiblenumber.toint()

// convertednumber 被猜測為型別"int?",或者型別 "optional int"

由於toint方法可能會失敗,所以它返回乙個可選的(optional)int,而不是乙個int。乙個可選的int被寫作int?

而不是int。

問號暗示包括的值是可選,也就是說可能包括int值也可能不包括值。

(不能包括其它不論什麼值比方bool值或者string值。

僅僅能是int或者什麼都沒有。)

if 語句以及強制解析

你能夠使用if語句來推斷乙個可選是否包括值。

假設可選有值,結果是true;假設沒有值。結果是false。

if convertednumber  else 

// 輸出 "123 has aninteger value of 123"

很多其它關於if語句的內容,請參考控制流。

注意:使用!來獲取乙個不存在的可選值會導致執行時錯誤。使用!來強制解析值之前。一定要確定可選包括乙個非nil的值。

可選繫結

使用可選繫結(optional binding)來推斷可選是否包括值,假設包括就把值賦給乙個暫時常量或者變數。可選繫結能夠用在if和while語句中來對可選的值進行推斷並把值賦給乙個常量或者變數。if和while語句,請參考控制流。

像以下這樣在if語句中寫乙個可選繫結:

if let constantname = someoptional

你能夠像上面這樣使用可選繫結來重寫possiblenumber這個樣例:

if let actualnumber =possiblenumber.toint()  else 

// 輸出 "123 has aninteger value of 123"

這段**能夠被理解為:

「假設possiblenumber.toint返回的可選int包括乙個值,建立乙個叫做actualnumber的新常量並將可選包括的值賦給它。」

假設轉換成功,actualnumber常量能夠在if語句的第乙個分支中使用。

它已經被可選包括的值初始化過。所以不須要再使用!字尾來獲取它的值。在這個樣例中,actualnumber僅僅被用來輸出轉換結果。

你能夠在可選繫結中使用常量和變數。假設你想在if語句的第乙個分支中操作actualnumber的值,你能夠改成if var actualnumber,這樣可選包括的值就會被賦給乙個變數而很量。

nil

你能夠給可選變數賦值為nil來表示它沒有值:

var serverresponsecode: int?

= 404

// serverresponsecode 包括乙個可選的 int 值 404

serverresponsecode = nil

// serverresponsecode 如今不包括值

注意:nil不能用於非可選的常量和變數。假設你的**中有常量或者變數須要處理值缺失的情況,請把它們宣告成相應的可選型別。

假設你宣告乙個可選常量或者變數可是沒有賦值,它們會自己主動被設定為nil:

var surveyanswer: string?

// surveyanswer 被自己主動設定為 nil

注意:swift 的nil和 objective-c中的nil並不一樣。在 objective-c 中。nil是乙個指向不存在物件的指標。在 swift 中。nil不是指標——它是乙個確定的值,用來表示值缺失。

不論什麼型別的可選都能夠被設定為nil。不僅僅是物件型別。

隱式解析可選

如上所述。可選暗示了常量或者變數能夠「沒有值」。

可選能夠通過if語句來推斷是否有值。假設有值的話能夠通過可選繫結來解析值。

有時候在程式架構中,第一次被賦值之後,能夠確定乙個可選總會有值。在這樣的情況下,每次都要推斷和解析可選值是很低效的。由於能夠確定它總會有值。

把想要用作可選的型別的後面的問號(string?)改成感嘆號(string!)來宣告乙個隱式解析可選。

當可選被第一次賦值之後就能夠確定之後一直有值的時候,隱式解析可選很實用。隱式解析可選主要被用在 swift 中類的構造過程中。請參考類例項之間的迴圈強引用。

乙個隱式解析可選事實上就是乙個普通的可選,可是能夠被當做非可選來使用,並不須要每次都使用解析來獲取可選值。以下的樣例展示了可選string和隱式解析可選string之間的差別:

let possiblestring: string? = "anoptional string."

println(possiblestring!) // 須要驚嘆號來獲取值

// 輸出 "an optionalstring."

println(assumedstring) // 不須要感嘆號

你能夠把隱式解析可選當做乙個能夠自己主動解析的可選。你要做的僅僅是宣告的時候把感嘆號放到型別的結尾,而不是每次取值的可選名字的結尾。

注意:假設你在隱式解析可選沒有值的時候嘗試取值。會觸發執行時錯誤。和你在沒有值的普通可選後面加乙個驚嘆號一樣。

你仍然能夠把隱式解析可選當做普通可選來推斷它是否包括值:

if assumedstring

你也能夠在可選繫結中使用隱式解析可選來檢查並解析它的值:

if let definitestring = assumedstring

注意:假設乙個變數之後可能變成nil的話請不要使用隱式解析可選。假設你須要在變數的生命週期中推斷是否是nil的話,請使用普通可選型別。

Swift學習筆記系列 (16)可選鏈

tags swift 學習筆記 可選鏈提供的是一種方便訪問可選型別值的途徑。可選鏈可以替代強制拆包的寫法,而且寫法可以更簡潔。可選鏈可以多級,直達你想要訪問的內容。可選鏈可以方法屬性 下標和方法。可選鏈返回的必定是乙個可選型別,返回nil則證明這條可選鏈中的某個環節是斷掉 其中有nil 的。用法 簡...

Swift程式語言學習1 7 斷言

斷言 可選能夠讓你推斷值是否存在,你能夠在 中優雅地處理值缺失的情況。然而,在某些情況下,假設值缺失或者值並不滿足特定的條件,你的 可能並不須要繼續執行。這時。你能夠在你的 中觸發乙個斷言 assertion 來結束 執行並通過除錯來找到值缺失的原因。使用斷言進行除錯 斷言會在執行時推斷乙個邏輯條件...

Swift16 可選鏈式呼叫

使用可選鏈式呼叫代替強制展開 為可選鏈式呼叫定義模型類 通過可選鏈式呼叫訪問屬性 通過可選鏈式呼叫呼叫方法 通過可選鏈式呼叫訪問下標 連線多層可選鏈式呼叫 在方法的可選返回值上進行可選鏈式呼叫。可選鏈式呼叫是一種可以在當前值可能為nil的可選值上請求和呼叫屬性 方法及下標的方法。如果可選值有值,那麼...