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..
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

你可能感兴趣的:(Swift Runtime探索 & Mirror)