swift里面!和?的作用


一般我們在以下兩種情況下會遇到!和?的使用
1.聲明變量時

var number: Int?

var str: String?

2.在對變量操作時

number?.hashValue 

str!.hashValue

由於這兩種情況的意義不同,所以分開進行解釋:

1>.聲明變量時
在聲明一個變量時,如果不手動初始化,Swift不會自動初始化該變量為一個默認值的。

var a: String 

var b = a                             // error :因為沒有初始化a,a沒有值

但是對於Optional的變量則不同,Optional的變量在聲明時如果不初始化,Swift會自動將該變量初始化為nil。聲明變量時在類型后添加?或者!,就是告訴編譯器這是一個Optional的變量,如果沒有初始化,你就將其初始化為nil

var a: String?                                   // a 為nil

var b: String?                                   // b 為nil

var a_test = a                                  // a_test 為nil

var b_test = b                                  // b_test 為nil

但是這兩者之間還是有一些區別的,詳細后面再講。
Optional事實上是一個枚舉類型,從下圖可以看出,Optional包含None和Some兩種類型,而nil就是Optional.None,非nil就是Optional.Some。如果Optional變量在聲明時不初始化,Swift會調用init()來初始化變量為nil,而用非nil的值初始化變量時,會通過Some(T)把該原始值包裝,所以在之后使用的時候我們需要通過解包取出原始值才能使用。

請輸入圖片描述

2.對變量進行操作時

var arrayCount = dataList?.count

這時問號的意思類似於isResponseToSelector,即如果變量是nil,則不能響應后面的方法,所以會直接返回nil。如果變量非nil,就會拆Some(T)的包,取出原始值執行后面的操作。

var arrayCount = dataList!.count

這里的嘆號和之前的問號則不同,這里表示我確定dataList一定是非nil的,所以直接拆包取出原始值進行處理。因此此處如果不小心讓dataList為nil,程序就會crash掉。

回到上面聲明時?和!區別的問題上去
聲明變量時的?只是單純的告訴Swift這是Optional的,如果沒有初始化就默認為nil,而通過!聲明,則之后對該變量操作的時候都會隱式的在操作前添加一個!。

總結

    1. 問號?
      a.聲明時添加?,告訴編譯器這個是Optional的,如果聲明時沒有手動初始化,就自動初始化為nil
      b.在對變量值操作前添加?,判斷如果變量時nil,則不響應后面的方法。
    2. 嘆號!
      a.聲明時添加!,告訴編譯器這個是Optional的,並且之后對該變量操作的時候,都隱式的在操作前添加!
      b.在對變量操作前添加!,表示默認為非nil,直接解包進行處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM