三種操作:is、as?和as!
Swift是強類型語言,但也允許開發者通過is、as?和as!這三種操作來對類型進行判斷和強制轉換。其中is用作類型判斷,而as?和as!則分別是類型轉換的可選形式和強制形式。在這里強調一下,swift中比較常用的向下轉換(downcast)是沒有as操作符的。
為了方便后面的解釋,這里假設定義了三個類,Fruit、Apple和Orange,其中Apple和Orange都繼承自Fruit。
is操作符
is操作用來判斷某一個對象是否是某一個特定的類,它會返回一個bool類型的值。is操作的邏輯很簡單,某一個類的對象肯定是自己這個類,也一定是自己的超類,但超類的對象不是子類。如果兩個類沒有繼承關系,那is操作一定返回false.
下面用代碼舉幾個例子看一下:
if apple is Apple{ println("這是個蘋果") //某個類的對象一定是自己這個類 } if apple is Fruit{ println("這是個蘋果") //某個類的對象也一定是它的超類 } if fruit is Apple{ println("這是個水果") //但超類的對象不是它的子類 } if apple is Orange{ println("這是個橘子") //沒有繼承關系的類肯定返回false }
需要注意的是,這里所說的一個對象的類,是指它真實的類而不是表現出來的類。比如把apple1和orange1放進數組,再取出來,由於數組的類型是[Fruit],所以通過下面這行代碼:
var fruit = array[0]
取出的fruit,雖然在swift中的表現形式為Fruit,但它實際上是Apple類的對象,在對它使用is操作的時候,要把它當做Apple類的對象來考慮。因此,雖然超類的對象不是子類,但fruit is Apple的返回值卻應該是true。
as!操作符
as!操作符是類型轉換的強制格式,優點在於代碼簡單,如果可以轉換,則會返回轉換了格式的對象,如果無法轉換就會拋出運行時錯誤。因此除非百分之百確定可以轉換,否則不應該使用as!來進行強制類型轉換。
和is操作符非常類似,類型轉換的規則是,某個類的對象可以轉換為自己這個類(這個其實是廢話),子類可以向上轉換為超類,但超類不能向下(downcast)轉換為子類。除非某個子類的對象表現形式為超類,但實際是子類,這時可以使用as!進行向下轉換(downcast)。
用代碼來說明一下:
// 這里假設fakeFruit是一個表現為Fruit類的Apple類對象 var fruit1 = fakeFruit as! Apple //這是as!的最常見用法,可以成功轉換 var fruit2 = fakeFruit as! Fruit //成功,子類可以向上轉換為超類 var fruit3 = fakeFruit as! Orange //失敗,沒有繼承關系的類不可以轉換 var orange = realFruit as! Orange //失敗,超類不可以強制轉換為子類
as?操作符
as?和as!操作符的轉換規則完全一樣,但是as?會返回一個被轉換類型的可選類型,需要我們解封。因此寫法會略有不同,以剛剛的第一個例子來說:
if var fruit = fakeFruit as? Apple{ //Do something with fruit }
另外,由於是可選類型,即使轉換失敗也不會報錯,所以比較推薦使用這種方式進行類型轉換。