你可以將它用在類和子類的層次結(jié)構(gòu)上,檢查特定類實例的類型并且轉(zhuǎn)換這個類實例的類型成為這個層次結(jié)構(gòu)中的其他類型。這下面的三個代碼段定義了一個類層次和一個包含了幾個這些類實例的數(shù)組,作為類型轉(zhuǎn)換的例子。
第一個代碼片段定義了一個新的基礎(chǔ)類MediaItem。這個類為任何出現(xiàn)在數(shù)字媒體庫的媒體項提供基礎(chǔ)功能。特別的,它聲明了一個 String 類型的 name 屬性,和一個init name初始化器。(它假定所有的媒體項都有個名稱。)
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
下一個代碼段定義了 MediaItem 的兩個子類。第一個子類Movie,在父類(或者說基類)的基礎(chǔ)上增加了一個 director(導(dǎo)演) 屬性,和相應(yīng)的初始化器。第二個類在父類的基礎(chǔ)上增加了一個 artist(藝術(shù)家) 屬性,和相應(yīng)的初始化器:
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
最后一個代碼段創(chuàng)建了一個數(shù)組常量 library,包含兩個Movie實例和三個Song實例。library的類型是在它被初始化時根據(jù)它數(shù)組中所包含的內(nèi)容推斷來的。Swift 的類型檢測器能夠演繹出Movie 和 Song有共同的父類 MediaItem ,所以它推斷出 MediaItem[] 類作為 library 的類型。
let library = [
Movie(name: "Casablanca", director: "Michael Curtiz"),
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
Movie(name: "Citizen Kane", director: "Orson Welles"),
Song(name: "The One And Only", artist: "Chesney Hawkes"),
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
// the type of "library" is inferred to be MediaItem[]
在幕后library 里存儲的媒體項依然是 Movie 和 Song 類型的,但是,若你迭代它,取出的實例會是MediaItem 類型的,而不是 Movie 和 Song 類型的。為了讓它們作為它們本來的類型工作,你需要檢查它們的類型或者向下轉(zhuǎn)換它們的類型到其它類型,就像下面描述的一樣。