swift - 镜像未在 Swift 3 上获取基类

标签 swift reflection metaprogramming

我正在构建一个函数,它将获取类对象的实例并将其转换为要发送到 Web 服务的 XML 请求。为了实现这一点,我使用镜像来迭代类中的键/值对。在我的测试中,我发现它工作得很好,但有一个主要问题,没有遇到任何继承的类参数。例如,在下面的代码中,对于“descriptionText,modelNumber和serialNumber,name和uuid从不收集”,循环执行了3次。有没有办法让我使用镜像并拾取基类的所有参数,如以及小部件?另外,如果有更好的方法来做到这一点,我洗耳恭听。

import UIKit

class BaseObject: NSObject { 
   var name = String()
   var uuid = String()
}

class Widget: BaseObject {
    var descriptionText = String()
    var modelNumber = String()
    var serialNumber = String()
}

var widget1 = Widget()

widget1.name = "Generic Widget"
widget1.uuid = "A guid"
widget1.descriptionText = "Class A Extra Larget Widget"
widget1.modelNumber = "1234"
widget1.serialNumber = "4321"

let widgetMirror = Mirror(reflecting: widget1)

for attr in widgetMirror.children {
    print(attr.label!)
}

最佳答案

您需要使用 superclassMirror: Mirror? 属性。例如:

for attr in widgetMirror.superclassMirror!.children {
    print(attr.label!)
}

打印预期结果:

name
uuid


更新。如果您不断遇到此问题,请将此Mirror扩展添加到您的工具包中:

extension Mirror {
    var allChildren: [Mirror.Child] {
        var allChildren: [Mirror.Child] = []
        var mirror: Mirror! = self
        repeat {
            allChildren.append(contentsOf: mirror.children)
            mirror = mirror.superclassMirror
        } while mirror != nil
        return allChildren
    }
}

用法:

for attr in widgetMirror.allChildren {
    print(attr.label!)
}

关于swift - 镜像未在 Swift 3 上获取基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812681/

相关文章:

c++ - 如何遍历 C++ 类的所有子类(在编译时)?

grails - 检查父类(super class)字段上是否存在注释

swift - 在 Swift 中写入 Firestore 时,如何将 addSnapshotListener 方法与 getDocument 一起使用?

python - 如何按照定义的顺序迭代类的属性?

swift - 如何在 Swift 中获取本地化的文件大小单位

java - 防止进一步实例化 Java 类的最佳实践

c# - 动态转换与反射调用 : which poison to pick?

java - 是否已更新 JavaBean 规范以反射(reflect)注解的存在

swift - 包含带有 LLVM 模块映射的 libxml2

swift - 删除Core Data实体时,DocumentDirectory中的音频文件是否也会被删除?