发布于 2015-06-14 01:54:48 | 149 次阅读 | 评论: 0 | 来源: 网络整理
你可以将它用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。这下面的三个代码段定义了一个类层次和一个包含了几个这些类实例的数组,作为类型转换的例子。
第一个代码片段定义了一个新的基础类MediaItem
。这个类为任何出现在数字媒体库的媒体项提供基础功能。特别的,它声明了一个 String
类型的 name
属性,和一个init name
初始化器。(它假定所有的媒体项都有个名称。)
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
下一个代码段定义了 MediaItem
的两个子类。第一个子类Movie
,在父类(或者说基类)的基础上增加了一个 director
(导演) 属性,和相应的初始化器。第二个类在父类的基础上增加了一个 artist
(艺术家) 属性,和相应的初始化器:
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)
}
}
最后一个代码段创建了一个数组常量 library
,包含两个Movie
实例和三个Song
实例。library
的类型是在它被初始化时根据它数组中所包含的内容推断来的。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
类型的。为了让它们作为它们本来的类型工作,你需要检查它们的类型或者向下转换它们的类型到其它类型,就像下面描述的一样。