Swift中的!和?

通常咱們在一下兩種狀況下會遇到!和?的使用
1.聲明變量時segmentfault

var number :Int?
var str : String!

2.在對變量操做時spa

number?.hashValue
str!.hashValue

因爲這兩種狀況的意義不一樣,因此分開進行解釋:code

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)把該原始值包裝,因此在以後使用的時候咱們須要經過解包取出原始值才能使用。hash

請輸入圖片描述

2.對變量進行操做時it

var arrayCount = dataList?.count

這時問號的意思相似於isResponseToSelector,即若是變量是nil,則不能響應後面的方法,因此會直接返回nil。若是變量非nil,就會拆Some(T)的包,取出原始值執行後面的操做。io

var arrayCount = dataList!.count

這裏的歎號和以前的問號則不一樣,這裏表示我肯定dataList必定是非nil的,因此直接拆包取出原始值進行處理。所以此處若是不當心讓dataList爲nil,程序就會crash掉。編譯

回到上面聲明時?和!區別的問題上去
聲明變量時的?只是單純的告訴Swift這是Optional的,若是沒有初始化就默認爲nil,而經過!聲明,則以後對該變量操做的時候都會隱式的在操做前添加一個!。class

總結

  1. 問號?
    a.聲明時添加?,告訴編譯器這個是Optional的,若是聲明時沒有手動初始化,就自動初始化爲nil
    b.在對變量值操做前添加?,判斷若是變量時nil,則不響應後面的方法。
  2. 歎號! a.聲明時添加!,告訴編譯器這個是Optional的,而且以後對該變量操做的時候,都隱式的在操做前添加! b.在對變量操做前添加!,表示默認爲非nil,直接解包進行處理
相關文章
相關標籤/搜索