这里总结一下as、as!、as?这三种类型转换操作符的异同以及使用场景。
1. as使用场合
(1)从派生类转换为基类,向上转型
class Animal {}
class Cat : Animal{}
let cat = Cat()
let animal = cat as Animal
(2)消除二义性,数值转换类型
let num1 = 43 as CGFloat
let num2 = 45.3 as Int
2.as!使用场合
向下转型时使用。由于是强制类型转换,如果转换失败会报runtime运行错误。
class Animal {}
class Cat:Animal{}
let animal:Animal = Cat();
let cat = animal as! Cat
3.as?
as?和as!的使用规则完全一样,但是as?如果转换不成功就会返回一个nil对象。成功的话就返回可选类型值(optional),需要我们拆包使用。
由于as?在转换失败的时候也不会出现错误,所以对于能确保100%会成功的转换可以使用as!,否则使用as?
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
}else{
print("cat is nil");
}