您好,登錄后才能下訂單哦!
本文來自于瘋子們的開源圖書
你可以在某個值可能缺失的情況下,使用可選類型。可選類型也就是:
要么有值,等于x
要么就什么都沒有
注意:
可選類型的概念在C和Objective-C當中是不存在。Objective-C當中最相近的東西就是,一個返回對象類型的函數,可以返回nil.nil表示不存在一個有效的對象。但是,這個只適用于對象,對于結構體,基本的C類型,枚舉,就不行了。對于這些類型,Objective-C的方法通常返回一個特殊值(比如NSNotFound)表示值的缺失。這種方法假設方法的調用者知道要返回一個特殊值來進行判斷。Swift的可選類型可以讓你表示任何類型值的缺失,再也不用那些特殊的常量了。
這里有個例子。Swift 的String 類型有個方法toInt,它可以將字符串轉成整型。但是,不是每個字符串都可以轉換成整型的。比方說,”123“可以轉換成數字123,但是"hello ,world"就沒有明顯的整型可以轉成的了。
下面的例子使用toInt方法,將字符串轉成整型:
由于toInt方法可能會失敗,它返回一個可選類型的Int,而不是單純的Int。一個可選類型的Int寫作Int?,而不是Int.問號表示當前變量是可選類型的,意味著變量可能包含整型值,或者根本什么都沒有(但不能包含其他的類型,比如Bool,String.記住,要么Int型,要么什么都沒有)。
你可以使用if語言來判斷一個可選類型的變量是否包含值。如果它確實包含值,那么就是true.如果它根本沒有值,那就是false.
一旦你確定該可選類型的變量缺失有值的話,你就可以通過在變量名稱后面加上嘆號(!)的方式訪問潛在的值。嘆號很有效的說明了:“我知道這個可選類型確實有值,放心的用去吧”。這個就是所謂的可選類型的強制拆箱。
注意:
嘗試在一個沒有值的可選類型上使用!, 會引發運行時錯誤。在使用!強制拆箱一個可選類型之前,一定要確保它有一個非nil值。
你可以通過綁定一個可選類型到一個常量或者變量中,不僅可以檢測可選類型是否含有值,還可以在之后通過這個臨時變量或者常量訪問他的值。通過一個操作,就可以在If 和while當中使用綁定來檢查可選當中的值,同時也可以將可選的值放到變量或者常量當中。if和while語句在流程控制當中有詳細的描述。
像下面這樣,在if語句當中實現可選類型的綁定:
你可以使用綁定代替強制拆箱,重寫上面的possibleNumber例子:
上面的代碼意思就是:
如果possibleNumber.toInt返回的可選Int變量包含值的話,就將可選變量的值賦給新的常量actualNumber.
如果上面的轉換是成功的話,就可以在if語句當中使用actualNumber了。它已經用可選變量的值初始化過了,因此就沒必要在使用!了。這個例子只是使用actualNumber來打印一下轉換結果。
綁定一個可選類型,既可以使用常量,也可以使用變量。如果你想在if語句當中操作actualNumber,你也可以寫成if var actualNumber,那么可選類型就是作為變量了,而不是常量了。
你可以通過給一個可選類型的變量賦予nil,來讓他處于沒有值的狀態:
注意:
nil 不能用于非可選類型的常量和變量。如果要在你的代碼中處理變量或者常量缺失值的情況,一定要將他們聲明為恰當的可選類型。
如果你在定義可選類型的變量或者常量的時候,沒有指定默認值的話,那么系統或自動賦給它nil的。
注意:
Swift的nil和Objective-C中的nil是不一樣的。在Objective-C中,nil是指向一個不存在對象的指針,而在Swift當中,nil不是一個指針,它代表某中類型值的缺失。任意類型的可選類型都可以賦予nil,而不只是對象類型的。
就像上面描述的一樣,可選類型表明一個變量或者常量允許沒有值。可以使用if語句檢查一個可選類型是否有值,如果有值的話,就可以使用綁定將可選類型進行拆箱。
有時候,從你的代碼結構當中可以清楚的知道一個可選類型一旦服了賦了值,之后總是有值的。在這種情況下,就沒有必要每次訪問可選類型,都經過檢查和拆箱了,因為我們明確的知道它一直都是有值的。
我們就上面這種情況的可選類型定義為隱式拆箱的可選類型。在你想將將它變成可選的類型后面,加上嘆號(!)而不是問號(?),就可以將它定義為隱式拆箱的可選類型了。
當一個可選類型第一次定義之后,可以很明確的知道之后它一定有值的話,隱式拆箱是非常有用的。在Swift中,隱式拆箱的主要作用就是在類的初始化過程中,參考“無主引用和隱式拆箱可選類型屬性”
隱式拆箱的可選類型其實就是一個普通的可選類型,只不過可以像普通的變量一樣使用,不用每次訪問的時候都拆箱了。下面的例子展示了一個可選類型的String和一個隱式拆箱的可選類型的String之間的區別:
你可以把一個隱式拆箱的可選類型想象成無論什么時候使用它,你都已經授權給他讓他自動拆箱了。在聲明可選類型的時候,在后面加上嘆號(!),這樣你就不用每次訪問值的時候,都在后面加上嘆號(!)了。
注意:
如果你在訪問一個隱式拆箱的時候,它沒有值,就會觸發一個運行時錯誤。結果和在一個普通的可選類型后面加上嘆號時的效果是一樣的。
你可以把隱式拆箱看成一個普通的可選類型來檢查它時候有值:
你也可以隱式拆箱上面使用綁定,來在同一句話當中實現檢查和拆箱:
注意:
如果一個變量的值可能在之后變成nil,那么就不應該使用隱式拆箱了。如果你在一個變量的聲明周期當中需要檢查它是否為nil 的話,請使用普通的可選類型。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。