//定義一個基類
class MediaItem {
var name : String?
init(name : String) {
self.name = name
}
}
//定義Movie繼承MediaItem
class Movie: MediaItem {
var director : String?
init(name : String, director : String) {
self.director = director
super.init(name : name)
}
}
//定義Song繼承MediaItem
class Song: MediaItem {
var artist : String?
init(name : String, artist : String) {
self.artist = artist
super.init(name : name)
}
}
// 創(chuàng)建了一個數組常量 library,包含兩個 Movie 實例和三個 Song 實例。library 的類型是在它被初始化時根據它數組中所包含的內容推斷來的。Swift 的類型檢測器能夠推斷出 Movie 和 Song 有共同的父類 MediaItem,所以它推斷出 [MediaItem] 類作為 library 的類型:
let library = [Movie(name:"喜劇之王",director:"周星馳"),
Movie(name:"唐人街探案",director:"陳思誠"),
Movie(name:"戰(zhàn)狼2",director:"吳京"),
Song(name:"給你們",artist:"張宇"),
Song(name:"大海",artist:"張雨生"),
Song(name:"動物世界",artist:"薛之謙")]
//用類型檢查操作符(is)來檢查一個實例是否屬于特定子類型
for item in library {
if item is Movie {
print("\(item.name!)是一部電影")
}else if item is Song {
print("\(item.name!)是一首歌曲")
}
}
//當你不確定向下轉型可以成功時,用類型轉換的條件形式(as?),只有你可以確定向下轉型一定會成功時,才使用強制形式(as!)
for item in library {
if let movie = item as? Movie {
print("\(movie.name!)的導演是\(movie.director!)")
}else if let song = item as? Song {
print("\(song.name!)的歌唱者是\(song.artist!)")
}
}
var chengDu = Song(name:"成都",artist:"趙雷")
//強制轉換(確定Song是MediaItem的父類)
let oneSong = chengDu as! MediaItem
print(oneSong.name!)
/*
Any 和 AnyObject 的類型轉換
Swift 為不確定類型提供了兩種特殊的類型別名:
Any 可以表示任何類型,包括函數類型。
AnyObject 可以表示任何類類型的實例。
只有當你確實需要它們的行為和功能時才使用 Any 和 AnyObject。在你的代碼里使用你期望的明確類型總是更好的。
*/
var array = [Any]()
array = [12,32,123,"1231"]
for item in array {
if item is String {
print(item)
}
}
總結:類型判斷是is,類型轉換是as(不確定能否成功用as?,確定用as!)