本文共 1875 字,大约阅读时间需要 6 分钟。
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)") }
转载地址:http://ymmgi.baihongyu.com/