Swift 2.0获取镜像超类属性

Swift 2.0获取镜像超类属性,第1张

概述我需要将我的类的属性作为字典.为简单起见,我创建了一个具有默认实现的协议,如下所示: protocol ListsProperties{ func toDictionary() -> [String: AnyObject]}extension ListsProperties{ func toDictionary() -> [String: AnyObject] { 我需要将我的类的属性作为字典.为简单起见,我创建了一个具有默认实现的协议,如下所示:
protocol ListsPropertIEs{    func toDictionary() -> [String: AnyObject]}extension ListsPropertIEs{    func toDictionary() -> [String: AnyObject] {        let mirrored_object = Mirror(reflecting: self)        var dict = [String: AnyObject]()        for (_,attr) in mirrored_object.children.enumerate() {            if let propertyname = attr.label as String! {                dict[propertyname] = attr.value as? AnyObject            }        }             return dict    }}

我的类可以符合这个协议,并且可以使用toDictionary()方法.但是,如果我在子类上使用该方法,则这不起作用,因为它只生成在子类上定义的属性并忽略父超类属性.

理想情况下,我可以找到一些方法来调用镜像超类上的toDictionary()方法,因为这会在它自己的超类上调用toDictionary(),并且编译器说超类镜像不符合协议,即使它正在镜像的类确实.

以下工作,但只有当只有一个超类时,这是不够的:

func toDictionary() -> [String: AnyObject] {    let mirrored_object = Mirror(reflecting: self)    var dict = [String: AnyObject]()    for (_,attr) in mirrored_object.children.enumerate() {        if let propertyname = attr.label as String! {            dict[propertyname] = attr.value as? AnyObject        }    }    // This is an issue as it limits to one subclass 'deep'     if let parent = mirrored_object.superclassMirror(){        for (_,attr) in parent.children.enumerate() {            if let propertyname = attr.label as String!{                if dict[propertyname] == nil{                    dict[propertyname] = attr.value as? AnyObject                }            }        }    }    return dict}

关于如何修改toDictionary()的默认实现以包含超类属性(以及超类的任何超类的属性等)的任何想法?

一种可能的解决方案是实现toDictionary()
作为Mirror本身的一种方法,以便您可以递归遍历
到超类镜像:
extension Mirror {    func toDictionary() -> [String: AnyObject] {        var dict = [String: AnyObject]()        // PropertIEs of this instance:        for attr in self.children {            if let propertyname = attr.label {                dict[propertyname] = attr.value as? AnyObject            }        }         // Add propertIEs of superclass:        if let parent = self.superclassMirror() {            for (propertyname,value) in parent.toDictionary() {                dict[propertyname] = value            }        }        return dict    }}

然后使用它来实现协议扩展方法:

extension ListsPropertIEs {    func toDictionary() -> [String: AnyObject] {        return Mirror(reflecting: self).toDictionary()    }}
总结

以上是内存溢出为你收集整理的Swift 2.0获取镜像超类属性全部内容,希望文章能够帮你解决Swift 2.0获取镜像超类属性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1050271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存