1. 程式人生 > >Swift入門(十一)——型別轉換與is、as操作

Swift入門(十一)——型別轉換與is、as操作

三種操作: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
}

另外,由於是可選型別,即使轉換失敗也不會報錯,所以比較推薦使用這種方式進行型別轉換。