在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 性能考虑