GitHub Demo: https://github.com/BaHui/BHSwifter
简介
Swift中
as
、as!
、as?
这三种类型转换操作符的异同和使用方式。
异同
相同点: 都可以用来做类型转换;
不同点: 1. [as] 有保证转换, 从派生类转换为基类的`向上转型`, 编译时会`自动检测`
2. [as!]无保证强制转换,从派生类转换为基类的`向下转型`, 若转换失败, 则`运行时崩溃`
3. [as?]被转化为可选值, 从派生类转换为基类的`向下转型`, 若转换失败, 则返回`nil`
使用场景
// 定义以下几种类 和 类与类之间的关系
class OthersClass: NSObject {}
// 父类
class SuperMan: NSObject {}
// 一级子类: Person
class Person: SuperMan {}
// 二级子类1: Teacher
class Teacher: Person {
var name: String?
}
- as使用场景 (关键字: Guaranteed conversion、 Upcasting)
// ****** 有保证的类型转换,从派生类转换为基类的向上转型 ******
let teacher = Teacher()
teacher.name = "teacher type"
// let person = teacher as OthersClass 编译报错
let person = teacher as SuperMan
print(person) // 输出: <As_Used.Teacher: 0x600000c26660>
- as!用法 (关键字: Forced conversion、 Downcasting)
// ********* 无保证强制转换,从派生类转换为基类的向下转型, 若转换失败, 则发生崩溃 ********
let person: Person = Teacher()
let _ = person as! Teacher
// let _ = person as! Student 运行时错误, 发生崩溃
- as? 用法 (关键字: Optional、 Nil)
// ***** 类型转换,从派生类转换为基类的向下转型, 若转换失败, 则返回nil *****
let person1: Person = Teacher()
if let _ = person1 as? Teacher {
print("person转换Teacher类型成功")
} else {
print("person转换Teacher类型失败")
}
// 输出: person转换Teacher类型成功
网友评论