Swift 类型转换 (as as! as? 区别)

Swift 语言中类型转换使用的关键字是as,与类型检查相似,Swift语言中的类型转换有向上兼容向下转换之分,也就是as,as?/as!的区别

as as! as? 的区别

  • as 向上转换,转换成自己的基类
  • as!想下转换 转换成自己的派生类,属于强制转换,转换失败会报错
  • as?与as! 格式相似,转换成自己的派生类,转换失败返回nil

例:

定义三个类 :"人(Person)" "学生(Student)" "教师(Teacher)",Person做为Student和Teacher的基类


// 定义人员基类 
class Person {
    var name : String
    
    init(_ name: String){
        self.name = name
    }
}

// 定义学生类
class Student : Person {
}

// 定义教师类
class Teacher : Person {
}

as: 是向上转换,转换成基类
        let student = Student("name")
        let person = student as Person
        print(person)
        
      //   let tearcher = person as Teacher  // 报错
as?是向下转化,转化成自己的派生类,转换失败返回nil
  let person2:Person = Teacher("LXW")
        
        let tearcher2 = person2 as? Teacher
        if let teamTearchers = tearcher2{
            print(teamTearchers)
        }
as! 和as?的转换模式相同,不同之处是转换失败会报错,是强制转换,确保100%会成功的转换则可使用 as!,否则使用 as?
 let tearcher3 = person2 as! Teacher

应用场景

  • 消除二义性,数值类型转换
let num1 = 42 as Double
        print(num1)
        //switch 语句中进行模式匹配
        switch num1 {
        case let num1 as Float:
            print("这是Folat")
        case let num1 as Double:
            print("这是Double")
        default:
            print("转换时报")
        }
  • 假如:有两个控制器 HomVC MeVC,在方法addsubController()中分别添加到ViewController的subviewControllers里面,你在另一个方法里面需要改变HomeVC 的一个属性,这时候你可以获取到viewController的subViewCOntrollers拿到一个ViewContoller,但是ViewController是HomVC的父类,你无法的到HomVC他独有的属性,这时候就需要 as? 做转换

你可能感兴趣的:(Swift 类型转换 (as as! as? 区别))