Swift - 反射Mirror

在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"]

更多文章

CocoaPods开源库的搭建
CocoaPods搭建私有库
CocoaPods搭建私有库遇到问题
CocoaPods私有库的升级维护
SKStoreReviewController之程序内评价
App应用程序图标的动态更换
开源框架 MGJRouter_Swift
iOS的MVP设计模式
iOS插件化
iOS FMDB的使用
Swift之ReactiveSwift
OC之ReactiveCocoa
OC之ReactiveCocoa进阶
iOS 性能考虑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。