class Animal {}
class Cat: Animal {}
class Dog: Animal {
var name = "Spot"
}
// 从子类到父类的转换,这样是可行的。这个转换被官方称为“Guaranteed conversion”。
// 一个类型的值可担保转换到另一个类型,这种转换的成功可以由编译器来保证。例如:向上转换(例:从一个类转换到它的父类),或指明一个文本表达(例:将1转换成Float型)
let a = Dog()
a as Animal
let dog: Dog? = nil
dog?.name // 评估为nil
dog!.name // 引发运行时错误
let animal: Animal = Cat()
// ?和swift中其他的?用法类似,就是可选类型,可以让某一对象值为空。
animal as? Dog // 评估为nil
// as! ,被官方成为强制转换"Forced conversion"
// 一个值强制转换为另一个值,它的安全性不能被编译器保证,因此它可能造成运行时错误。例如向下转换,将一个类向它的派生类转换。
animal as! Dog // 引发运行时错误