swift

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的实际应用。
当然上面的例子还是很粗超的,实际开发中我们肯定不会直接这么用。用框架不香么😁

上一篇下一篇

猜你喜欢

热点阅读