在 Swift 中,
as、as?和as!是类型转换操作符,它们分别用于不同场景下的类型转换需求。
简单概述
as 主要是向上类型的转换,这种转换是子类向父类的转换,是不存在转换类型出错的问题。
as? as!是向下类型的转换,是从父类向子类的转换,因为父类可能同时存在多个子类情况,可以在转换过程中不清楚转换为继承父类的哪个子类,所以转换过程中存在不清楚转换路径问题,所以通过使用as?返回可选类型, as!强制转换指定类型。
下面相对详细了解下!
正文
as(向上类型转换)
- 用于 向上类型转换(Upcasting)或在编译时已知类型的情况下进行转换。
- 可以安全地从子类转换为父类,或者将某个类型转换为协议类型。
- 这种转换是无风险的,不需要强制解包或可选类型。
let animal: Animal = Dog() // Dog 子类被转换为 Animal 父类
let view = someView as UIView // 将子类的 View 类型转换为父类 UIView
as?(可选的向下类型转换)
- 用于向下类型转换(Downcasting),即将父类或协议类型转换为子类。如果转换失败,返回
nil。 - 适合在转换不确定是否会成功的场景下使用,因为它会返回一个可选值(
Optional)。 - 安全,因为即使转换失败程序也不会崩溃。
let animal: Animal = Dog()
let dog = animal as? Dog // 如果 animal 不是 Dog 类型,dog 会是 nil
as!(强制向下类型转换)
- 同样用于向下类型转换(Downcasting),但它是强制转换。
- 如果转换失败,程序会崩溃,因此仅在你确定类型转换一定会成功时使用。
- 适用于类型转换后立刻需要使用非可选类型的情况。
let animal: Animal = Dog()
let dog = animal as! Dog // 如果 animal 不是 Dog 类型,程序会崩溃
🍳 记性不太好,我会时常回来瞅一瞅,因为我都记录下来了!