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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值