Swift中的可選類型(Optional)

Swift中的可選類型(Optional)

##什麼是Optional數據庫

Optional在Swift中表示可選類型,那麼什麼是可選類型?swift

咱們都知道,在Swift中,屬性的值都是不能爲nil的,可是在正常狀況下你不可能一開始就肯定全部屬性的值,又或者你根據條件查詢數據,你要返回這條數據,但假如沒有符合條件的數據,那該怎麼辦?ide

這時就可使用可選類型,在Swift中,你想要讓一個屬性的值爲nil,你必須使用Optional(可選類型),Optional實際上是一個泛型enum(枚舉),裏面包含兩種狀況,一種是沒有值,即nil,另外種是有值,就是你原類型的值,僞代碼以下:code

enum Optional<T> {
    case None
    case Some(T)
}

至於爲何enum能夠這麼寫?跟其餘語言中的enum不同?這個後面有空會專門寫一篇。get

那麼要怎樣使用Optional呢?其實很簡單,只須要在定義屬性時,在後面跟個?或者!便可,代碼以下:博客

var str:String?
println(str)

這段代碼會輸出nilio

##Optional後面的?!是什麼意思?class

對於類型而言,他們沒有任何區別,都是表示一個Optional類型,他們的區別只是語法上的。泛型

?表示該屬性是一個不肯定值的屬性,即該屬性的值有可能爲空 !表示該屬性有值,解包當作原類型來使用,但若是該屬性沒有值時(即nil),會致使異常語法

###何時該用!

在你定義個一個屬性,而且該屬性的值在正常狀況下不會爲nil時,你應該直接在屬性定義時使用!解包,方便後續使用,例如:

/*
    因爲這個屬性與storyboard中的UILabel關聯了
    因此在初始化UI的時候就會自動初始化這個屬性,並賦值
    也就是說這個屬性默認狀況下有值,且後續操做中都有值(假如你不設置爲nil的話)
    因此這裏應該使用!來解包,以簡化後續操做
    */
    @IBOutlet var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //由於屬性在定義時已經解包,因此這裏直接當作原類型使用,即UILabel類型
        label.text = "hello"
    }

若是將!改爲?的話,就會出現下圖的錯誤,提示你未解包,由於?表示這個屬性值不肯定,即有可能爲nil,若是是nil,那確定不能操做,因此會要求你進行解包,那你就須要在每次操做label屬性時加上!進行解包,就顯得很麻煩

###何時該用?

在你定義一個屬性,而且該屬性的值在正常狀況下可能爲nil時,你應該在定義屬性時使用?

好比你要從數據庫中獲取一條記錄,但該記錄可能不存在,在後續的操做中,因爲該屬性是?(不肯定值的屬性),你在使用時必需要進行解包,這會提醒你該屬性可能爲nil,你須要判斷他是否爲nil,在進行相應的操做,以提升程序的健壯性

在沒查詢到結果的狀況下:

在查詢到結果狀況下:

假如你在屬性定義時使用了!,那麼在後續操做中將不會提示你進行解包,你有可能會忘記該屬性在正常狀況下也會爲nil,你直接把它拿來使用將會拋出異常。

##總結

在Swift中Optional表示可選類型,可選類型的值能夠爲nil

在類型後面加上?或者!即表示可選類型

若是一個屬性在正常狀況下可能爲nil,那最好用?,這會在你使用時提示你須要解包,你就可使用if解包並判斷其是否爲nil,能提高程序健壯性

若是一個屬性在正常狀況下不會爲nil,那最好用!,能夠方便後續操做

不肯定值(?) -> 肯定值(!

var name:String?
name = "Peter"
println(name!)

本文轉自本人獨立博客,更多文章請訪問 -> Yenn的雜物間

相關文章
相關標籤/搜索