swift语言新特性:可选值
var ?a? ?此處的a就是個可選值,意思是該值可能是缺失的.
可選
使用可選(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:
因為toInt方法可能會失敗,所以它返回一個可選的(optional)Int,而不是一個Int。一個可選的Int被寫作Int?而不是Int。問號暗示包含的值是可選,也就是說可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什么都沒有。)
?
if 語句以及強制解析
你可以使用if語句來判斷一個可選是否包含值。如果可選有值,結果是true;如果沒有值,結果是false。
?
當你確定可選包確實含值之后,你可以在可選的名字后面加一個感嘆號(!)來獲取值。這個驚嘆號表示“我知道這個可選有值,請使用它。”這被稱為可選值的強制解析(forced unwrapping):
更多關于if語句的內容,請參考控制流。
?
注意:使用!來獲取一個不存在的可選值會導致運行時錯誤。使用!來強制解析值之前,一定要確定可選包含一個非nil的值。
?
可選綁定
使用可選綁定(optional binding)來判斷可選是否包含值,如果包含就把值賦給一個臨時常量或者變量。可選綁定可以用在if和while語句中來對可選的值進行判斷并把值賦給一個常量或者變量。if和while語句,請參考控制流。
?
像下面這樣在if語句中寫一個可選綁定:
你可以像上面這樣使用可選綁定來重寫possibleNumber這個例子:
這段代碼可以被理解為:
?
“如果possibleNumber.toInt返回的可選Int包含一個值,創建一個叫做actualNumber的新常量并將可選包含的值賦給它。”
?
如果轉換成功,actualNumber常量可以在if語句的第一個分支中使用。它已經被可選包含的值初始化過,所以不需要再使用!后綴來獲取它的值。在這個例子中,actualNumber只被用來輸出轉換結果。
?
你可以在可選綁定中使用常量和變量。如果你想在if語句的第一個分支中操作actualNumber的值,你可以改成if var actualNumber,這樣可選包含的值就會被賦給一個變量而非常量。
?
nil
你可以給可選變量賦值為nil來表示它沒有值:
注意:nil不能用于非可選的常量和變量。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型。
?
如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設置為nil:
注意:Swift 的nil和 Objective-C 中的nil并不一樣。在 Objective-C 中,nil是一個指向不存在對象的指針。在 Swift 中,nil不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選都可以被設置為nil,不只是對象類型。
?
隱式解析可選
如上所述,可選暗示了常量或者變量可以“沒有值”。可選可以通過if語句來判斷是否有值,如果有值的話可以通過可選綁定來解析值。
?
有時候在程序架構中,第一次被賦值之后,可以確定一個可選總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值。
?
這種類型的可選被定義為隱式解析可選(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選。
?
當可選被第一次賦值之后就可以確定之后一直有值的時候,隱式解析可選非常有用。隱式解析可選主要被用在 Swift 中類的構造過程中,請參考類實例之間的循環強引用。
?
一個隱式解析可選其實就是一個普通的可選,但是可以被當做非可選來使用,并不需要每次都使用解析來獲取可選值。下面的例子展示了可選String和隱式解析可選String之間的區別:
你可以把隱式解析可選當做一個可以自動解析的可選。你要做的只是聲明的時候把感嘆號放到類型的結尾,而不是每次取值的可選名字的結尾。
?
注意:如果你在隱式解析可選沒有值的時候嘗試取值,會觸發運行時錯誤。和你在沒有值的普通可選后面加一個驚嘆號一樣。
?
你仍然可以把隱式解析可選當做普通可選來判斷它是否包含值:
你也可以在可選綁定中使用隱式解析可選來檢查并解析它的值:
注意:如果一個變量之后可能變成nil的話請不要使用隱式解析可選。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型。
總結
以上是生活随笔為你收集整理的swift语言新特性:可选值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift可选绑定、断言
- 下一篇: Xcode代码块功能