美文网首页swift
Swift反射机制Mirror

Swift反射机制Mirror

作者: 三国韩信 | 来源:发表于2021-04-11 15:19 被阅读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的实际应用。
当然上面的例子还是很粗超的,实际开发中我们肯定不会直接这么用。用框架不香么😁

相关文章

  • Swift中的反射Mirror

    Swift中的反射Mirror [TOC] 前言 Mirror是Swift中的反射机制,对于C#和Java开发人员...

  • Swift反射机制Mirror

    反射就是可以动态获取类型、成员信息,在运行时可以调用方法、属性等行为的特性。对于一个纯 Swift 类来说,并不支...

  • 源码

    反射 Swift通过Mirror类型来提供简单的反射功能

  • 反射 Mirror | Swift 动态性

    Mirror是Swift中的反射机制,反射就是可以动态的获取类型以及成员信息,同时也可以在运行时动态的调用方法和属...

  • Swift - 反射Mirror

    在Swift中并不提倡使用Runtime,而是像其他语言一样使用反射(Reflect)。当然,目前Swift中的反...

  • swift-Mirror反射

    打印结果: Mirror 可以动态获取类型、成员变量,在运行时可以调用方法、属性等行为的特性. Mirror.sw...

  • swift 进阶:反射机制Mirror & 错误处理

    swift 进阶之路:学习大纲[https://www.jianshu.com/p/115367c3eefd] 内...

  • Swift-进阶:Mirror源码解析

    本文主要是分析Mirror的底层实现,以及根据Mirror底层原理仿写其结构的实现 在Swift-进阶:反射Mir...

  • Swift底层探索:反射

    反射Mirror 反射就是可以动态获取类型、成员信息,在运行时可以调用方法、属性等行为的特性。对于纯Swift类来...

  • Swift-06:反射Mirror

    本文主要介绍Mirror的使用以及使用Mirror进行JSON解析的错误处理 反射Mirror 反射:是指可以动态...

网友评论

    本文标题:Swift反射机制Mirror

    本文链接:https://www.haomeiwen.com/subject/lzqzcltx.html