手机移动程序开发互联网科技iOS开发

Swift - 反射Mirror

2019-01-09  本文已影响0人  __Mr_Xie__

在Swift中并不提倡使用Runtime,而是像其他语言一样使用反射(Reflect)。当然,目前Swift中的反射还没有其他语言中的反射功能强大,不仅远不及OC的Runtime,离Java的反射也有一定的距离。Swift的反射机制是基于一个叫 Mirror 的 struct 来实现的,其内部有如下属性和方法:

// 对象的子节点。
let children: Children   
// 对象的展示风格
displayStyle: Mirror.DisplayStyle?
// 对象的类型
let subjectType: Any.Type   
// 对象父类的 mirror
func superclassMirror() -> Mirror?   

Swift反射实用样例:
先创建类User

    var name: String?
    var nickname:String?
    var age:Int = 0
    var emails:[String]?
}

接着创建一个User对象,通过反射获取这个对象的信息:

let user1 = User()
user1.name = "hangge"
user1.age = 100
user1.nickname = "xiaoming"
user1.emails = ["hangge@hangge.com","system@hangge.com"]
        
let mirror = Mirror(reflecting: user1)
        
print("对象类型:\(mirror.subjectType)")
print("对象子元素个数:\(mirror.children.count)")
        
print("--- 对象子元素的属性名和属性值分别如下 ---")
for case let (label?, value) in mirror.children {
    let mi = Mirror(reflecting: value)
    if mi.displayStyle != Mirror.DisplayStyle.optional {
       print("属性:\(label)  值:\(value)")
    } else {
       let (_, some) = mi.children.first!
       print("属性:\(label)  值:\(some)")
    }
}
对象类型:User
对象子元素个数:4
--- 对象子元素的属性名和属性值分别如下 ---
属性:name  值:hangge
属性:nickname  值:xiaoming
属性:age  值:100
属性:emails  值:["hangge@hangge.com", "system@hangge.com"]
image
上一篇 下一篇

猜你喜欢

热点阅读