Swift知识碎片: 初学容易混淆的 as, as?, as! 的区别

129 阅读2分钟

在 Swift 中,asas?as! 是类型转换操作符,它们分别用于不同场景下的类型转换需求。

简单概述

as 主要是向上类型的转换,这种转换是子类父类的转换,是不存在转换类型出错的问题。

as? as!向下类型的转换,是从父类子类的转换,因为父类可能同时存在多个子类情况,可以在转换过程中不清楚转换为继承父类的哪个子类,所以转换过程中存在不清楚转换路径问题,所以通过使用as?返回可选类型, as!强制转换指定类型。

下面相对详细了解下!

正文

  1. as(向上类型转换)
  • 用于 向上类型转换(Upcasting)或在编译时已知类型的情况下进行转换。
  • 可以安全地从子类转换为父类,或者将某个类型转换为协议类型。
  • 这种转换是无风险的,不需要强制解包或可选类型。
let animal: Animal = Dog()  // Dog 子类被转换为 Animal 父类
let view = someView as UIView  // 将子类的 View 类型转换为父类 UIView
  1. as?(可选的向下类型转换)
  • 用于向下类型转换(Downcasting),即将父类或协议类型转换为子类。如果转换失败,返回 nil
  • 适合在转换不确定是否会成功的场景下使用,因为它会返回一个可选值(Optional)。
  • 安全,因为即使转换失败程序也不会崩溃。
let animal: Animal = Dog()
let dog = animal as? Dog  // 如果 animal 不是 Dog 类型,dog 会是 nil
  1. as!(强制向下类型转换)
  • 同样用于向下类型转换(Downcasting),但它是强制转换。
  • 如果转换失败,程序会崩溃,因此仅在你确定类型转换一定会成功时使用。
  • 适用于类型转换后立刻需要使用非可选类型的情况。
let animal: Animal = Dog()
let dog = animal as! Dog  // 如果 animal 不是 Dog 类型,程序会崩溃

🍳 记性不太好,我会时常回来瞅一瞅,因为我都记录下来了!