前言
在#33中,我們曾經提過一個東西叫做協定檢查,其中有一個很關鍵的關鍵字叫做as?,而當時未多對此進行說明,故本篇章會將重點放在型別的轉換與檢查一事上,對is、as的用法進行解析。
正文
Swift 提供兩個運算子:
is
跟as
來檢查一個值的型別以及將一個值轉換成另一種型別。基於類別繼承的特性,一個子類別繼承於另一個父類別時,這個子類別的型別除了可以是自己之外,也可以是父類別型別。下面例子以三個類別(一個基礎類別及兩個繼承自它的子類別)示範
is
及as
的使用方法:(資料來源:Swift起步走)
is的用法
原則上,is的檢查會回傳一個Bool值,是這個類別會返回true,不是則會返回false。
以下稍微舉個例子:
1.我們先建置一些類別,讓Adam、Hudson都繼承自Human。

2.接下來建置一個陣列來放置剛剛的類別

3.最後我們走訪剛剛建置的陣列,然後內部用一個if…else的判斷式來篩選,假如角色有符合Adam,就+1,Hudson,亦+1。
總之,is 這個條件出去後,如果符合,就+1。
不過,這裡有一個重點,由於is是對等關係的,也就是說,在例證中,我們是檢查的Adam是類別的實體、Hudson也是,所以is是針對同樣類別的情況。
as的用法
一個類別的常數或變數,可能實際上是屬於一個子類別(像是前面提的例子)。當遇到這種情況,可以嘗試使用型別轉換運算子
as?
或as!
將其向下型別轉換至子類別型別。如果不確定向下型別轉換是否能夠成功,則使用
as?
來轉換,這會返回一個可選值,如果向下型別轉換失敗會返回一個nil
,這樣的特性可以讓你檢查向下型別轉換是否成功。如果確定向下型別轉換一定成功時,則可以使用強制性的
as!
來轉換。但如果轉換至一個錯誤的型別,則會觸發程式運行時錯誤。(資料來源:Swift起步走)
承繼自上面的例子,這邊以as作為延伸:

綜合上述,我們可以看到的是lf2裡面的陣列,其內容物都是型別Human,而這時候,我們要把someOne做為Adam型別,所以就用了as做型別轉換這件事。
補充:Any、AnyObject
- AnyObject:可以表示任何類別型別的實體。

如上所述:EverTypePlayer、GospelPlayer、JazzPlayer都有加上實體化的參數值,所以足見AnyObject可以表示任何類別實體
- Any以表示為任何型別。

如果標示[Any]( )的時候,則代表可以放入任何型別。