日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swift语言新特性:可选值

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

  • 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。

    ?

    當你確定可選包確實含值之后,你可以在可選的名字后面加一個感嘆號(!)來獲取值。這個驚嘆號表示“我知道這個可選有值,請使用它。”這被稱為可選值的強制解析(forced unwrapping):

  • if?convertedNumber?{?
  • ????println("\(possibleNumber)?has?an?integer?value?of?\(convertedNumber!)")?
  • }?else?{?
  • ????println("\(possibleNumber)?could?not?be?converted?to?an?integer")?
  • }?
  • //?輸出?"123?has?an?integer?value?of?123"?
  • 更多關于if語句的內容,請參考控制流。

    ?

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

    ?

    可選綁定

    使用可選綁定(optional binding)來判斷可選是否包含值,如果包含就把值賦給一個臨時常量或者變量。可選綁定可以用在if和while語句中來對可選的值進行判斷并把值賦給一個常量或者變量。if和while語句,請參考控制流。

    ?

    像下面這樣在if語句中寫一個可選綁定:

  • if?let?constantName?=?someOptional?{?
  • ????statements?
  • }?
  • 你可以像上面這樣使用可選綁定來重寫possibleNumber這個例子:

  • if?let?actualNumber?=?possibleNumber.toInt()?{?
  • ????println("\(possibleNumber)?has?an?integer?value?of?\(actualNumber)")?
  • }?else?{?
  • ????println("\(possibleNumber)?could?not?be?converted?to?an?integer")?
  • }?
  • //?輸出?"123?has?an?integer?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語句來判斷是否有值,如果有值的話可以通過可選綁定來解析值。

    ?

    有時候在程序架構中,第一次被賦值之后,可以確定一個可選總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值。

    ?

    這種類型的可選被定義為隱式解析可選(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選。

    ?

    當可選被第一次賦值之后就可以確定之后一直有值的時候,隱式解析可選非常有用。隱式解析可選主要被用在 Swift 中類的構造過程中,請參考類實例之間的循環強引用。

    ?

    一個隱式解析可選其實就是一個普通的可選,但是可以被當做非可選來使用,并不需要每次都使用解析來獲取可選值。下面的例子展示了可選String和隱式解析可選String之間的區別:

  • let?possibleString:?String??=?"An?optional?string."?
  • println(possibleString!)?//?需要驚嘆號來獲取值?
  • //?輸出?"An?optional?string."?
  • ?
  • let?assumedString:?String!?=?"An?implicitly?unwrapped?optional?string."?
  • println(assumedString)??//?不需要感嘆號?
  • //?輸出?"An?implicitly?unwrapped?optional?string."?
  • 你可以把隱式解析可選當做一個可以自動解析的可選。你要做的只是聲明的時候把感嘆號放到類型的結尾,而不是每次取值的可選名字的結尾。

    ?

    注意:如果你在隱式解析可選沒有值的時候嘗試取值,會觸發運行時錯誤。和你在沒有值的普通可選后面加一個驚嘆號一樣。

    ?

    你仍然可以把隱式解析可選當做普通可選來判斷它是否包含值:

  • if?assumedString?{?
  • ????println(assumedString)?
  • }?
  • //?輸出?"An?implicitly?unwrapped?optional?string."?
  • 你也可以在可選綁定中使用隱式解析可選來檢查并解析它的值:

  • if?let?definiteString?=?assumedString?{?
  • ????println(definiteString)?
  • }?
  • //?輸出?"An?implicitly?unwrapped?optional?string."?
  • 注意:如果一個變量之后可能變成nil的話請不要使用隱式解析可選。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型。

    總結

    以上是生活随笔為你收集整理的swift语言新特性:可选值的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。