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
}
另外,由於是可選型別,即使轉換失敗也不會報錯,所以比較推薦使用這種方式進行型別轉換。