美文网首页
Swift Runtime探索 & Mirror

Swift Runtime探索 & Mirror

作者: H丶ym | 来源:发表于2021-01-15 16:49 被阅读0次

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

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

相关文章

网友评论

      本文标题:Swift Runtime探索 & Mirror

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