美文网首页
Swift-反射Mirror及消息派发

Swift-反射Mirror及消息派发

作者: Sweet丶 | 来源:发表于2023-04-15 17:39 被阅读0次

    反射是编程语言中一项强大的能力:

    • 对于任意一个类型,能动态获取这个类的所有属性、方法信息。
    • 对于任意实例,能动态调用它的任意方法和属性。
    一、Swift中的反射功能

    Swift中目前通过Mirror来实现反射功能。

    func testMirror() {
        let mirror = Mirror(reflecting: ZLCar())
        
        // 展示类型:`struct`、`class`、`enum`、tuple、optional、collection、dictionary、set
        // 闭包的mirror.displayStyle是nil
        print(mirror.displayStyle!)
        
        // 类型名:这里是ZLCar
        print(mirror.subjectType)
        
        // 可以通过children属性来获取内部的子结构
        print(mirror.children)
        for pro in mirror.children {
            // 属性名,属性值
            print("\(pro.label): \(pro.value)")
        }
        
        // 对象父类的mirror
        print(mirror.superclassMirror)
    }
    
    二、Swift中的消息派发方式
    1. 直接派发
    • 全局函数
    • 使用static声明的方法
    • 使用final声明的所有方法,使用final声明的类里面的所有方法
    • 使用private声明的方法和属性,会隐式final声明
    • 值类型的方法,比如struct和enum中的方法
    • 在extension中没有使用@objc修饰的实例方法
    2. 函数表派发
    • 只有引用类型才是函数表派发
    • 在Swift中,类的方法默认使用函数表派发的方式
    • Swift对于协议Protocol默认使用的是函数表派发,协议可以为struct提供多态的支持
    • Swift的函数表叫做 witness table(C++叫做virtual table)
      1.每个子类都有自己的表结构
      2.对于类中每个重写的方法,都有不同的函数指针
      3.当子类添加新方法时,这些方法指针会添加到函数表的末尾
      4.在运行时使用此表来调用函数的实现 (函数表指针 + 函数偏移 就能找到对应的方法)
    3. 消息派发
    • 用dynamic修饰的方法是消息派发。
    • 对于继承自NSObject的Swift类,消息派发方式。
      注意: @objc修饰方法,只是把方法暴露给objc,是函数表派发

    想了解更多可以阅读文章
    反射 Mirror | Swift 动态性

    相关文章

      网友评论

          本文标题:Swift-反射Mirror及消息派发

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