Swift反射机制Mirror
2021-04-11 本文已影响0人
三国韩信
反射就是可以动态获取类型、成员信息,在运行时可以调用方法、属性等行为的特性。对于一个纯 Swift 类来说,并不支持我们直接像 OC 那样使用runtime的API来操作,但是 Swift 标准库依然提供了反射机制(Mirror)让我们访问成员信息。简而言之Mirror就是Swift的runtimeApi,不过功能没有OC的runtime辣么强大。
简单版Mirror使用:
class LGTeacher {
var name: String = "Lucy"
var age: Int = 18
}
let t: LGTeacher = LGTeacher()
let m = Mirror(reflecting: t)
for (label,vaule) in m.children {
print("\(label!):\(vaule)")
}
// name:Lucy
// age:18
进阶版Mirror使用 ——> Model转Dictionary
// 通过mirror 把LGTeacher对象解析为字典
class LGTeacher {
var name: String = "Lucy"
var age: Int = 18
}
let t: LGTeacher = LGTeacher()
func test(_ obj: Any) -> Any {
let mirror = Mirror(reflecting: obj)
var dic: [String: Any] = [:]
guard !mirror.children.isEmpty else {return obj}
for case let (label?, value) in mirror.children {
dic[label] = test(value)
}
return dic
}
print(test(t))
// ["age": 18, "name": "Lucy"]
再进阶版Mirror使用 ——> 抽取成协议
protocol JsonMapCoding {
func jsonMap() -> Any
}
extension JsonMapCoding {
func jsonMap() -> Any {
let mirror = Mirror(reflecting: self)
var dic: [String: Any] = [:]
guard !mirror.children.isEmpty else {return self}
for children in mirror.children {
if let value = children.value as? JsonMapCoding {
if let keyName = children.label {
dic[keyName] = value.jsonMap()
}else{
print("key为空")
}
}else {
print("没有遵守JsonMapCoding协议")
}
}
return dic
}
}
extension Int: JsonMapCoding{}
extension String: JsonMapCoding{}
class LGTeacher: JsonMapCoding{
var name: String = "Lucy"
var age: Int = 18
}
let t: LGTeacher = LGTeacher()
print(t.jsonMap())
// ["age": 18, "name": "Lucy"]
通过3个小例子进一步理解Mirror的实际应用。
当然上面的例子还是很粗超的,实际开发中我们肯定不会直接这么用。用框架不香么😁