Swift 中使用 is 和 as 操作符,用于去检查值的类型,或者转换它的类型。也可以用它来检查一个类型 是否遵循了某个协议。
is
用is来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。
var movieCount = 0
var songCount = 0
for item in arr {
if item is Movie {
movieCount += 1
} else if item is Song {
songCount += 1
}
}
向下转型
某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试用as? 或 as!向下转到它的子类型。
因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式 as? 返回一个你试图向下转成的类型的可选值;强制形式 as! 把试图向下转型和强制解包转换结果结合为一个操作。
当你不确定向下转型可以成功时,用as?。总是返回一个可选值,且若下转是不可能的,可选值将是 nil。这使你能够检查向下转型是否成功。
只有你可以确定向下转型一定会成功时,才使用as!。当你试图向下转型为一个不正确的类型时,会触发一个运行时错误。
for item in arr {
if let movie = item as? Movie {
print("电影: \(movie.name)")
} else if let song = item as? Song {
}
}
// item as? Movie 的返回值是 Movie?
if let movie = item as? Movie,可以这样解读:
“尝试将 item 转为 Movie 类型。若成功,则将返回的 可选项Movie?解包,赋值给临时常量 movie
转换没有真的改变实例或它的值。根本的实例保持不变;只是简单地把它作为它被转换成的类型来使用。