Swift剛開始學習的時候,最讓人困惑的大概是爲何程序裏面會有這麼多的? ! ??了吧,何時要用?,何時要用!,經常把新手弄得暈頭轉向,本文就來詳細講講"?" "!" "??",這些操做符到底該如何使用
顧名思義可空值
就是能夠爲空的值,表現形式是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中輸入變量名稱,會彈出一些提示。指針
看紅色方框處的內容,若是是帶問號的,說明是一個可空值,不帶問號的,就是不可空值,固然咱們也能夠經過控制檯輸出來查看,有Optional包裹的是可空值,沒有包裹的是不可空值。code
在何時咱們須要對可空值進行轉換呢,好比你的變量是一個可空值,可是你須要傳入的參數是一個不可空值,又或者你的變量是一個可空值,可是由於Optional包裹,影響了你的顯示,或者判斷,這時候也須要轉換成一個不可空值去顯示,一個可空值轉換爲不可空值有多種方法,下面咱們一一列舉對象
直接加!
若是你能肯定你的變量必定不爲空,能夠直接加!把可空值變爲不可空值,最簡單的是先作一個不爲空的判斷blog
var a = AVUser.current()?.username if(a != nil){ var b = a! }
使用??
當你不想寫不少不爲空的判斷的時候, 而且,你能夠爲你的變量設置一個默認值的時候, 可使用 ??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都等於空,而且不會報錯。可是在沒有可空不可空概念的語言中,咱們須要不少不爲空的判斷,才能保證不會出現空指針異常。
as
或as?
或as!
首先咱們要知道as
究竟是幹嗎的,as
是用來將某一種對象強制轉換爲另外一種對象的時候使用的。若是你只須要把一個可空值轉換爲不可空的值,一般來講不會使用as來轉換,固然也能夠實現,可是不推薦,並且也沒這個必要
若是你的變量是一個不可空值,那麼很簡單,當你須要把它強制轉換成另外一種對象的時候,直接使用as
就能夠了
若是你的變量是一個可空值,你要轉換成另外一種可空類型,也能夠直接使用as?
var a = location.projectLocationKeyPlan?.keyPlanImage as? TObject
此時a是一個TObject?
類型
若是你要轉換成不可空的類型,那麼你須要用到as!
,固然,前提是你要肯定你的變量確實不是空值。
var a = location.projectLocationKeyPlan?.keyPlanImage as! TObject
此時a是一個TObject
類型
文章內容若有錯誤歡迎指正,後續還會進行一些補充,歡迎評論提問, 或者補充內容。