Swift Runtime探索 & Mirror

先用下面这段代码来测试一下

class LGTeacher {
    var age: Int = 18
    func teach(){
        print("teach")
    }
}

let t = LGTeacher()

func test(){
    var methodCount: UInt32 = 0
    let methodList = class_copyMethodList(LGTeacher.self, &methodCount)
    for i in 0..<numericCast(methodCount) {
        if let method = methodList?[i]{
            let methodName = method_getName(method)
            print("方法列表:\(methodName)")
        }else{
            print("not found method")
        }
    }
    
    var count: UInt32 = 0
    let proList = class_copyPropertyList(LGTeacher.self, &count)
    for i in 0..<numericCast(count) {
        if let property = proList?[i]{
            let propertyName = property_getName(property)
            print("属性成员属性:\(property)")
        }else{
            print("没有找到你要的属性")
        }
    }
    print("test run")
}

test()
test run
Program ended with exit code: 0

结果显示,无论是方法列表还是属性列表,都是空的

如果LGTeacher继承于NSObject呢?

class LGTeacher :NSObject{
    var age: Int = 18
    func teach(){
        print("teach")
    }
}
方法列表:init
test run
Program ended with exit code: 0

结果显示,方法列表只有init ,属性列表还是是空的

为属性和方法添加@objc关键字,并且去掉NSObject

class LGTeacher {
    @objc var age: Int = 18
    @objc func teach(){
        print("teach")
    }
}
方法列表:teach
方法列表:age
方法列表:setAge:
属性成员属性:0x0000000100008250
test run
Program ended with exit code: 0

结果显示,不管是Method还是Property都打印出来了

总结

  • 对于纯Swift类来说,没有 动态特性,就算继承NSObject
  • 对于纯Swift类,方法和属性添加@objc的情况下,是可以通过Runtime API拿到的

反射 Mirror

反射就是动态获取类型、成员信息,在运行时可以调用方法、属性等行为,既然Swift不支持,但是Swift的标准库却提供了反射机制。

Mirror 的简单使用
class Teacher: NSObject {
    var age: Int = 18
}

let t = Teacher()

let mirror = Mirror(reflecting: t)
for pro in mirror.children{
    print("\(String(describing: pro.label)): \(pro.value)")
}
Optional("age"): 18
Program ended with exit code: 0
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.swift强引用 我们编写如下代码 我们经过lldb调试 那么引用计算内都包含什么信息呢,接下来我们用源码探索...
    MonKey_Money阅读 246评论 0 0
  • Runtime 运⾏这段代码你会发现,当前不管是我们的⽅法列表还是我们的属性列表,此次此刻都是为空的。如果将当前的...
    Mjs阅读 838评论 0 1
  • swift进阶 学习大纲[https://www.jianshu.com/p/0fc67b373540] 上一节,...
    markhetao阅读 981评论 0 5
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,590评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,620评论 0 11