ios/swift之反射

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)")
        }
        

猜你喜欢

转载自blog.csdn.net/u011146511/article/details/86589913