Swift之as、as?和as!

as

Guaranteed conversation + Upcasting

有保证的转换,从派生类转换为基类的向上转型。

1
2
3
4
5
6
7
let num = 1 as CGFloat	//将1转成float

//dog转成父类animal
class Animal{}
calss Dog: Animal{}
let d = Dog()
d as Animal

as!

Forced conversation + Downcasting

as!表示强制转换,向下转型,即基类向派生类转型。由于是强制类型转换,在转换失败时会报runtime运行时错误。

1
2
3
4
5
6
// Dog到Animal的转化
class Animal {}
class Dog: Animal {}
let a: Animal = Dog()
a as Dog // as不能将a转成Dog,即不能向下转换
a as! Dog // as!能强行将a转成Dog

as?

Optional、 Nil

as? 和 as! 操作符的转换规则完全一样。但as?如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。 由于as?在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用as?

1
2
3
4
5
6
7
8
9
10
11
// Dog、Cat和Animal的转换关系 
class Animal {}
class Cat: Animal {}
class Dog: Animal {
var name = "Spot"
}
let dog: Dog? = nil dog?.name // 选择调用,返回空值nil
dog!.name // 强行调用,报错
let animal: Animal = Cat()
animal as? Dog // 猫转狗失败,返回nil
animal as! Dog // 猫强行转狗,失败报错