先用下面这段代码来测试一下
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
网友评论