Swift-新手最難懂的"?" "!" "??"全解析

Swift剛開始學習的時候,最讓人困惑的大概是爲何程序裏面會有這麼多的? ! ??了吧,何時要用?,何時要用!,經常把新手弄得暈頭轉向,本文就來詳細講講"?" "!" "??",這些操做符到底該如何使用

定義

  • 可空值(optional) | 純淨的類名,如String、Bool、Document等
  • 不可空值(non-null) | 帶問號的類名,如String?、Bool?、Document?、ABC?等

顧名思義可空值就是能夠爲空的值,表現形式是Optional,一個可空值,當咱們在控制檯輸出的時候,會發現它始終被一個Optional("")包裹着。swift

var s = String? = "this is optional string."

上例中,咱們能夠知道s實際上並不爲空,但它的類型是String?,所以它是一個可空值,因此當咱們用控制檯輸出s,會發現,實際上s的值是Optional("this is optional string."),若是這個時候咱們還認爲它的值是this is optional string.,程序邏輯就可能發生一些錯誤。學習

不可空值在理解和使用過程當中就很簡單,不須要更多贅述。this

肯定類型

可空值,在必要的時候仍是很是有用,但經常也給咱們形成很多的麻煩。那麼咱們如何知道一個變量究竟是一個可空值仍是一個不可空值呢?
首先咱們舉一些簡單的例子:url

var a = XObject()?.name

var b = AA.name() //name()返回的是可空值

以上兩種狀況是屬於比較簡單,很容易就能辨別a和b均爲可空值,可是不管多麼複雜的狀況,均可以用最簡單的辦法知道,這個變量究竟是可空的仍是不可空的。spa

A()?.b.c?.d.e | xx.a.b.c 不論多長,不論有沒有問號感嘆號,首先用一個變量接收,而後在Xcode中輸入變量名稱,會彈出一些提示。指針

clipboard.png
看紅色方框處的內容,若是是帶問號的,說明是一個可空值,不帶問號的,就是不可空值,固然咱們也能夠經過控制檯輸出來查看,有Optional包裹的是可空值,沒有包裹的是不可空值。code

轉換

在何時咱們須要對可空值進行轉換呢,好比你的變量是一個可空值,可是你須要傳入的參數是一個不可空值,又或者你的變量是一個可空值,可是由於Optional包裹,影響了你的顯示,或者判斷,這時候也須要轉換成一個不可空值去顯示,一個可空值轉換爲不可空值有多種方法,下面咱們一一列舉對象

  • 直接加!
    若是你能肯定你的變量必定不爲空,能夠直接加!把可空值變爲不可空值,最簡單的是先作一個不爲空的判斷blog

    var a = AVUser.current()?.username
    if(a != nil){
        var b = a!
    }

clipboard.png

  • 使用??
    當你不想寫不少不爲空的判斷的時候, 而且,你能夠爲你的變量設置一個默認值的時候, 可使用 ??ip

    var a : String = location.projectLocationKeyPlan?.keyPlanImage ?? ""

    這段代碼的意思是,若是location.projectLocationKeyPlan?.keyPlanImage是null,那麼a="",也就是說a的默認值是"",由於a不是一個可空值,因此即便location.projectLocationKeyPlan?.keyPlanImage是Optional("xxx"),a依然等於"xxx".

?的使用

看了以上的描述,應該很好奇?是在何時使用的吧。其實?也是可空值的專利,當你要調用一個可空值的方法,或者是獲取屬性的時候,就須要使用?,在其餘沒有可空不可空概念的語言中,若是一個變量是空的,你仍然要調用它的方法,那就會出現空指針異常。因此咱們一般都要加一個不爲空的判斷,這很麻煩,但在swift中變的簡單,只須要在可空的變量後面加一個?,即便變量的值是空,依然不會有任何異常,由於不會執行後面的代碼,而且讓整個表達式的值直接返回空。
好比:

var a = location?.projectLocationKeyPlan?.keyPlanImage?.url?.string

上述代碼中,不論location projectLocationKeyPlan keyPlanImage url string中任何一個爲空,a都等於空,而且不會報錯。可是在沒有可空不可空概念的語言中,咱們須要不少不爲空的判斷,才能保證不會出現空指針異常。

何時使用asas?as!

首先咱們要知道 as究竟是幹嗎的, as是用來將某一種對象強制轉換爲另外一種對象的時候使用的。若是你只須要把一個可空值轉換爲不可空的值,一般來講不會使用as來轉換,固然也能夠實現,可是不推薦,並且也沒這個必要

若是你的變量是一個不可空值,那麼很簡單,當你須要把它強制轉換成另外一種對象的時候,直接使用as就能夠了

若是你的變量是一個可空值,你要轉換成另外一種可空類型,也能夠直接使用as?

var a = location.projectLocationKeyPlan?.keyPlanImage as? TObject

此時a是一個TObject?類型

clipboard.png

若是你要轉換成不可空的類型,那麼你須要用到as!,固然,前提是你要肯定你的變量確實不是空值。

var a = location.projectLocationKeyPlan?.keyPlanImage as! TObject

此時a是一個TObject類型

clipboard.png

總結

文章內容若有錯誤歡迎指正,後續還會進行一些補充,歡迎評論提問, 或者補充內容。

相關文章
相關標籤/搜索