Swift的反射机制是基于一个叫Mirror的结构体来实现的。你为具体的实例创建一个Mirror对象,然后就可以通过它查询这个实例
Mirror结构体常用属性:
subjectType:对象类型
children:反射对象的属性集合
displayStyle:反射对象展示类型
目前反射的应用比较局限,这里做简单的介绍
1.*******//分别获取父亲和子类的属性值********
//分别获取父亲和子类的属性值
class fatherClass: NSObject {
var name:String = "fuMName"
var qq: String = "fuQQ"
}
class childrenClass: fatherClass {
var age:Int = 50
var sex:Bool = true
class func test() {
let obj: childrenClass = childrenClass()
let morror = Mirror.init(reflecting: obj)
let superMorror = Mirror.init(reflecting: obj).superclassMirror
for (name, value) in (superMorror?.children)! {//获取父类的属性和值
print("父类属性名:\(String(describing: name)) 值: \(value)")
}
for (name, value) in (morror.children) {//获取子类的属性和值
print("子类属性名:\(String(describing: name)) 值: \(value)")
}
}
}
打印结果:
//父类属性名:Optional("name") 值:fuName
//父类属性名:Optional("qq") 值:fuQQ
//子类属性名:Optional("age") 值: 1
//子类属性名:Optional("sex") 值: true
2.***********获取对象的属性********
let muselect = LYBreflectView.init(frame: CGRect.init(x: 0, y: 0, width: WIDTH, height: HEIGHT))
muselect.name="lambo"
muselect.age=10
let mirror:Mirror = Mirror(reflecting: muselect)//LYBreflectView对象的反射
print("获取对象类型:\(mirror.subjectType)")
//反射的所有自元素都是对象的属性,通过label获取对象的属性名,value获取对象的属性值
for p in mirror.children {
let propertyNameString = p.label! // 属性名使用!,label是optional类型,要强制解包
let value = p.value // 属性的值
print("\(propertyNameString)的值为:\(value)")
}
// 遍历获取对象所有动态的属性类型
for p in mirror.children {
let propertyNameString = p.label!
let value = p.value
let vMirror = Mirror(reflecting: value) // 通过值来创建属性的反射
print("属性\(propertyNameString)类型为:\(vMirror.subjectType)")
}