类型转换在Java和Swift中非常的相似,这个一般都是在类中, 可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。也可以用它来检查一个类型是否实现了某个协议,协议相当于Java中的接口。
检查类型(Checking Type)
用类型检查操作符(is)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。Java中使用instanceof关键字来类型检查。
swift:
if item is Movie {
++movieCount
} else if item is Song {
++songCount
}
Java:
if(item instanceof Movie) {
++movieCount
} else if(item instanceof Song) {
++songCount
}
向下转型(Downcasting)
某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类型,用类型转换操作符(as? 或 as!)。
因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式(conditional form)as? 返回一个你试图向下转成的类型的可选值(optional value)。强制形式 as! 把试图向下转型和强制解包(force-unwraps)转换结果结合为一个操作。
当你不确定向下转型可以成功时,用类型转换的条件形式(as?)。条件形式的类型转换总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是 nil。这使你能够检查向下转型是否成功。
只有你可以确定向下转型一定会成功时,才使用强制形式(as!)。当你试图向下转型为一个不正确的类型时,强制形式的类型转换会触发一个运行时错误。
swift:
if let movie = item as? Movie {
print("Movie: '\(movie.name)', dir. \(movie.director)")
} else if let song = item as? Song {
print("Song: '\(song.name)', by \(song.artist)")
}
Java:
Movie movie = ((Movie)item)
很像吧。
Any 和 AnyObject 的类型转换
Swift 为不确定类型提供了两种特殊的类型别名:
- AnyObject 可以表示任何类类型的实例。
- Any 可以表示任何类型,包括函数类型。
Java中所有类都是Object类的子类,所以Object可以表示任何类型的实例,包括函数类型,不区分类类型和其他类型。
这个很简单,不必多说。