第十八章 类型转换
类型转换是一种用来检查类型的实例,或着把这个实例看作一个不同与它自己类层级中的一个父类或子类。Type casting is a way to check the type of an instance, or to treat that instance as a different superclass or subclass from somewhere else in its own class hierarchy.
类型转换在swift里面用is
和as
运算符来表示。这两个运算符提供的是一个最简单明了的方法来检查某个值的类型或着把这个值转换成不同的类型。我们也可以使用类型转换来检查某个类型是否实现某个协议,详情见协议章节。
1. Defining a Class Hierarchy for Type Casting (为类型转换定义一个类层级)
我们可以使用类型转换在类的层级或子类中用来检查某个实例的类型和将该实例转换到相同的类层级中的另一个类里面去。
这个第一段代码定义的是一个基类MediaItem
,提供的任何物品都能出现在这个数字媒体库里面的一个功能。定义了一个类型为String
的name
的属性和一个init name
的构造器。(假设所有的物品,可以分为电影,歌曲… 都会有一个名字的)
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
第二段代码定义的是MediaItem
的两个子类。第一个子类Movie,封装了有关Movie的一些附加信息。包括在基类MediaItem用相对应的构造器添加了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的实例。这个数组是通过构造器里面数组的值推断出来的类型,swift里面的类型检测器能够推断出Movie和Song有个相同的父类MediaItem,所以这两个子类将[MediaItem]
推断出成这个library的数组。
let library = [
Movie(name: "Casablanca", director