天天看點

第八節 可選(Optionals)類型 主标簽

本文來自于瘋子們的開源圖書

你可以在某個值可能缺失的情況下,使用可選類型。可選類型也就是:

要麼有值,等于x

要麼就什麼都沒有

注意:

可選類型的概念在c和objective-c當中是不存在。objective-c當中最相近的東西就是,一個傳回對象類型的函數,可以傳回nil.nil表示不存在一個有效的對象。但是,這個隻适用于對象,對于結構體,基本的c類型,枚舉,就不行了。對于這些類型,objective-c的方法通常傳回一個特殊值(比如nsnotfound)表示值的缺失。這種方法假設方法的調用者知道要傳回一個特殊值來進行判斷。swift的可選類型可以讓你表示任何類型值的缺失,再也不用那些特殊的常量了。

這裡有個例子。swift 的string 類型有個方法toint,它可以将字元串轉成整型。但是,不是每個字元串都可以轉換成整型的。比方說,”123“可以轉換成數字123,但是"hello ,world"就沒有明顯的整型可以轉成的了。

下面的例子使用toint方法,将字元串轉成整型:

第八節 可選(Optionals)類型 主标簽

由于toint方法可能會失敗,它傳回一個可選類型的int,而不是單純的int。一個可選類型的int寫作int?,而不是int.問号表示目前變量是可選類型的,意味着變量可能包含整型值,或者根本什麼都沒有(但不能包含其他的類型,比如bool,string.記住,要麼int型,要麼什麼都沒有)。

if語句和強制拆箱

你可以使用if語言來判斷一個可選類型的變量是否包含值。如果它确實包含值,那麼就是true.如果它根本沒有值,那就是false.

一旦你确定該可選類型的變量缺失有值的話,你就可以通過在變量名稱後面加上歎号(!)的方式通路潛在的值。歎号很有效的說明了:“我知道這個可選類型确實有值,放心的用去吧”。這個就是所謂的可選類型的強制拆箱。

第八節 可選(Optionals)類型 主标簽

嘗試在一個沒有值的可選類型上使用!, 會引發運作時錯誤。在使用!強制拆箱一個可選類型之前,一定要確定它有一個非nil值。

可選類型的綁定

你可以通過綁定一個可選類型到一個常量或者變量中,不僅可以檢測可選類型是否含有值,還可以在之後通過這個臨時變量或者常量通路他的值。通過一個操作,就可以在if 和while當中使用綁定來檢查可選當中的值,同時也可以将可選的值放到變量或者常量當中。if和while語句在流程控制當中有詳細的描述。

像下面這樣,在if語句當中實作可選類型的綁定:

第八節 可選(Optionals)類型 主标簽

你可以使用綁定代替強制拆箱,重寫上面的possiblenumber例子:

第八節 可選(Optionals)類型 主标簽

上面的代碼意思就是:

如果possiblenumber.toint傳回的可選int變量包含值的話,就将可選變量的值賦給新的常量actualnumber.

如果上面的轉換是成功的話,就可以在if語句當中使用actualnumber了。它已經用可選變量的值初始化過了,是以就沒必要在使用!了。這個例子隻是使用actualnumber來列印一下轉換結果。

綁定一個可選類型,既可以使用常量,也可以使用變量。如果你想在if語句當中操作actualnumber,你也可以寫成if var actualnumber,那麼可選類型就是作為變量了,而不是常量了。

nil

你可以通過給一個可選類型的變量賦予nil,來讓他處于沒有值的狀态:

第八節 可選(Optionals)類型 主标簽

nil 不能用于非可選類型的常量和變量。如果要在你的代碼中處理變量或者常量缺失值的情況,一定要将他們聲明為恰當的可選類型。

如果你在定義可選類型的變量或者常量的時候,沒有指定預設值的話,那麼系統或自動賦給它nil的。

第八節 可選(Optionals)類型 主标簽

swift的nil和objective-c中的nil是不一樣的。在objective-c中,nil是指向一個不存在對象的指針,而在swift當中,nil不是一個指針,它代表某中類型值的缺失。任意類型的可選類型都可以賦予nil,而不隻是對象類型的。

可選類型的隐式拆箱

就像上面描述的一樣,可選類型表明一個變量或者常量允許沒有值。可以使用if語句檢查一個可選類型是否有值,如果有值的話,就可以使用綁定将可選類型進行拆箱。

有時候,從你的代碼結構當中可以清楚的知道一個可選類型一旦服了賦了值,之後總是有值的。在這種情況下,就沒有必要每次通路可選類型,都經過檢查和拆箱了,因為我們明确的知道它一直都是有值的。

我們就上面這種情況的可選類型定義為隐式拆箱的可選類型。在你想将将它變成可選的類型後面,加上歎号(!)而不是問号(?),就可以将它定義為隐式拆箱的可選類型了。

當一個可選類型第一次定義之後,可以很明确的知道之後它一定有值的話,隐式拆箱是非常有用的。在swift中,隐式拆箱的主要作用就是在類的初始化過程中,參考“無主引用和隐式拆箱可選類型屬性”

隐式拆箱的可選類型其實就是一個普通的可選類型,隻不過可以像普通的變量一樣使用,不用每次通路的時候都拆箱了。下面的例子展示了一個可選類型的string和一個隐式拆箱的可選類型的string之間的差別:

第八節 可選(Optionals)類型 主标簽

你可以把一個隐式拆箱的可選類型想象成無論什麼時候使用它,你都已經授權給他讓他自動拆箱了。在聲明可選類型的時候,在後面加上歎号(!),這樣你就不用每次通路值的時候,都在後面加上歎号(!)了。

如果你在通路一個隐式拆箱的時候,它沒有值,就會觸發一個運作時錯誤。結果和在一個普通的可選類型後面加上歎号時的效果是一樣的。

你可以把隐式拆箱看成一個普通的可選類型來檢查它時候有值:

第八節 可選(Optionals)類型 主标簽

你也可以隐式拆箱上面使用綁定,來在同一句話當中實作檢查和拆箱:

第八節 可選(Optionals)類型 主标簽

如果一個變量的值可能在之後變成nil,那麼就不應該使用隐式拆箱了。如果你在一個變量的聲明周期當中需要檢查它是否為nil 的話,請使用普通的可選類型。