美文网首页
Swift之类型转换 [as、 as! 、as?]

Swift之类型转换 [as、 as! 、as?]

作者: XiaoBaa | 来源:发表于2018-11-03 02:53 被阅读48次

GitHub Demo: https://github.com/BaHui/BHSwifter

简介

Swift中asas!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类型成功

交流与建议

相关文章

网友评论

      本文标题:Swift之类型转换 [as、 as! 、as?]

      本文链接:https://www.haomeiwen.com/subject/irwhxqtx.html