Swift Mirror

Swift 通过 Mirror 在运行时检测、访问或者修改类型的行为的特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct Person {
let name: String
let age: Int
}

let xiaoMing = Person(name: "XiaoMing", age: 16)
let r = Mirror(reflecting: xiaoMing)

print("属性个数:\(r.children.count)")
// 通过 Mirror 初始化得到的结果中包含的元素的描述都被集合在 children 属性下
// 其类型是 `public typealias Children = AnyCollection<Mirror.Child>`
for i in r.children {
print("属性名:\(i)")
}
/*
属性名:(Optional("name"), "XiaoMing")
属性名:(Optional("age"), 16)
*/

// 也可以通过 `dump` 快速输出某个对象
dump(xiaoMing)
/*
▿ Person
- name: "XiaoMing"
- age: 16
*/

也可以使用 Mirror 来达到 Objecttive-C 中 KVC 的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func valueFrom(object: Any, key: String) -> Any? {
let mirror = Mirror(reflecting: object)

for i in mirror.children {
let (targetKey, targetMirror) = i
if key == targetKey {
return targetMirror
}
}

return nil
}

if let name = valueFrom(object: xiaoMing, key: "name") as? String {
print("通过 key 得到值: \(name)")
}

参考

Swift Mirror