溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

第八節(jié) 可選(Optionals)類型 主標簽

發(fā)布時間:2020-06-30 20:14:47 來源:網(wǎng)絡 閱讀:221 作者:habout632 欄目:移動開發(fā)

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


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

  • 要么有值,等于x

  • 要么就什么都沒有

注意:

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

這里有個例子。Swift 的String 類型有個方法toInt,它可以將字符串轉成整型。但是,不是每個字符串都可以轉換成整型的。比方說,”123“可以轉換成數(shù)字123,但是"hello ,world"就沒有明顯的整型可以轉成的了。

下面的例子使用toInt方法,將字符串轉成整型:

第八節(jié) 可選(Optionals)類型  主標簽

由于toInt方法可能會失敗,它返回一個可選類型的Int,而不是單純的Int。一個可選類型的Int寫作Int?,而不是Int.問號表示當前變量是可選類型的,意味著變量可能包含整型值,或者根本什么都沒有(但不能包含其他的類型,比如Bool,String.記住,要么Int型,要么什么都沒有)。

 

If語句和強制拆箱

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

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

第八節(jié) 可選(Optionals)類型  主標簽

注意:

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

可選類型的綁定

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

像下面這樣,在if語句當中實現(xiàn)可選類型的綁定:

第八節(jié) 可選(Optionals)類型  主標簽

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

第八節(jié) 可選(Optionals)類型  主標簽

上面的代碼意思就是:

如果possibleNumber.toInt返回的可選Int變量包含值的話,就將可選變量的值賦給新的常量actualNumber.

如果上面的轉換是成功的話,就可以在if語句當中使用actualNumber了。它已經(jīng)用可選變量的值初始化過了,因此就沒必要在使用!了。這個例子只是使用actualNumber來打印一下轉換結果。

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

nil

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

第八節(jié) 可選(Optionals)類型  主標簽

注意:

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

如果你在定義可選類型的變量或者常量的時候,沒有指定默認值的話,那么系統(tǒng)或自動賦給它nil的。第八節(jié) 可選(Optionals)類型  主標簽

注意:

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

可選類型的隱式拆箱

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

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

我們就上面這種情況的可選類型定義為隱式拆箱的可選類型。在你想將將它變成可選的類型后面,加上嘆號(!)而不是問號(?),就可以將它定義為隱式拆箱的可選類型了。

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

隱式拆箱的可選類型其實就是一個普通的可選類型,只不過可以像普通的變量一樣使用,不用每次訪問的時候都拆箱了。下面的例子展示了一個可選類型的String和一個隱式拆箱的可選類型的String之間的區(qū)別:

第八節(jié) 可選(Optionals)類型  主標簽

你可以把一個隱式拆箱的可選類型想象成無論什么時候使用它,你都已經(jīng)授權給他讓他自動拆箱了。在聲明可選類型的時候,在后面加上嘆號(!),這樣你就不用每次訪問值的時候,都在后面加上嘆號(!)了。

注意:

如果你在訪問一個隱式拆箱的時候,它沒有值,就會觸發(fā)一個運行時錯誤。結果和在一個普通的可選類型后面加上嘆號時的效果是一樣的。

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

第八節(jié) 可選(Optionals)類型  主標簽

你也可以隱式拆箱上面使用綁定,來在同一句話當中實現(xiàn)檢查和拆箱:

第八節(jié) 可選(Optionals)類型  主標簽

注意:

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

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI