Swift 将属性动态镜像到另一个类

Swift 将属性动态镜像到另一个类,swift,reflection,Swift,Reflection,我目前正在与Swift框架一起使用。现在,这两个都需要模型类(燕麦可以自动序列化)。我对给定燕麦模型和领域模型的结构如下: class OatmealModel: SerializableObject { var id: Int = 0 var someOtherProperty: String? var anotherUnknownProperty: SomeType? var store: RealmModel? } class RealmModel: O

我目前正在与Swift框架一起使用。现在,这两个都需要模型类(燕麦可以自动序列化)。我对给定燕麦模型和领域模型的结构如下:

class OatmealModel: SerializableObject {
    var id: Int = 0
    var someOtherProperty: String?
    var anotherUnknownProperty: SomeType?

    var store: RealmModel?
}

class RealmModel: Object {
    dynamic var id: Int = 0
    dynamic var someOtherProperty: String?
    dynamic var anotherUnknownProperty: SomeType?

    override static func primaryKey() -> String? {
        return "id"
    }
}
应该清楚的是,它们都具有相同的属性,但我始终与之交互的是
OatmealModel
。除此之外,
OatmealModel
还实现了一个检索数据的协议:

protocol PersistentStore {
    func save()

    func findStore()

    func all() -> [PersistentStore]

    func filter(predicate: NSPredicate) -> [PersistentStore]
}
这些方法允许我们从Realm数据库中获取数据,然后对燕麦模型进行水合处理,然后只返回燕麦模型。然后调用
save
将写回realm

所以本质上,我想做的是:

  • 当从领域数据库和水合燕麦模型检索实体时,这应该自动完成。目前,每个燕麦模型都必须单独设置
    all
    filter
    (和
    save
    )方法来替换类名,并且当前必须手动设置属性。我的计划是以某种方式在燕麦模型和领域模型上使用反射来查看哪些属性具有相同的名称和类型,然后将它们从一个属性写到另一个属性
目前,我还不知道该怎么做,所以任何关于如何使用反射的提示都会很有帮助。我假设以某种方式使用镜像来提取属性,然后循环遍历它们,看看另一个中是否存在同名的属性

另外,为了最终实现这一点,因为模型这样做是为了返回自身的实例,模型是否有可能在不显式写入类型的情况下创建自己类型的数组?例如
[Self]
(不起作用)而不是
[OatmealModel]


我对Swift相当陌生,但熟悉一些其他语言和概念,非常感谢您的帮助

您可以将运行时内省与使用
NSObject
对两个类进行子类化结合使用,后者允许您为给定键设置给定类的值(=变量名,
setValueForKey
)。然而,这是完全不快速的,并且消除了Swift所熟知的任何类型和运行时安全性。你应该能够在不采取这些措施的情况下实现你的目标。虽然我有点不确定这是什么,但我只能建议不要以这种方式使用运行时内省(如果我们有这样一个观点:通常有一个更好的解决方案后退几步)。幸运的是,燕麦对象和领域对象在本质上都是NSObject的子类,但是让我们看看是否有一种方法不需要运行时内省。。。