类型
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
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)
}
}
let library = [
Movie(name: "111", director: "222"),
Song(name: "333", artist: "444"),
Movie(name: "555", director: "666"),
Song(name: "777", artist: "888"),
Song(name: "999", artist: "000"),
]
print(type(of: library))
let movie = [
Movie(name: "111", director: "222"),
Movie(name: "555", director: "666"),
]
print(type(of: movie))
let song = [
Song(name: "333", artist: "444"),
Song(name: "777", artist: "888"),
Song(name: "999", artist: "000"),
]
print(type(of: song))
执行结果如下:
Array<MediaItem>
Array<Movie>
Array<Song>
类型检查
- 使用类型检查操作符(is)来检查一个实例是否属于一个特定的子类。如果实例是该子类类型,类型检查操作符返回 true,否则返回 false。
向下类型转换
- 某个类类型的常量或变量可能实际上在后台引用自一个子类的实例。当你遇到这种情况时你可以尝试使用类型转换操作符(as? 或 as!)将它向下类型转换至其子类类型。
- 由于向下类型转换可能失败,类型转换操作符就有了两个不同形式。条件形式 as? 返回了一个你将要向下类型转换的值的可选项。强制形式,as! 则向下类型转换和强制展开结合为一个步骤。
Any 和 AnyObject
- Swift 为不确定的类型提供了两种特殊的类型别名:
- AnyObject 可以表示任何类类型的实例。
- Any 可以表示任何类型,包括函数类型。
let library = [
Movie(name: "111", director: "222"),
Song(name: "333", artist: "444"),
Movie(name: "555", director: "666"),
Song(name: "777", artist: "888"),
Song(name: "999", artist: "000"),
]
for item in library {
if let realItem = item as? Movie {
print(realItem.director)
}
}
执行结果如下:
222
666
嵌套类型
- Swift 中的类,结构体和枚举可以进行嵌套,即在同一类型的内部定义类型,这种类型嵌套在 java 中称为内部类,在 C# 中成为嵌套类。
- 嵌套类型能够访问它外部的成员。