在Swift中使用泛型实例化Realm对象

时间:2018-10-02 18:58:59

标签: swift generics realm

我正在一个iOS项目中工作,涉及Realm和泛型的使用。我正在探索克隆克隆的Realm对象的方法,以在写事务之外对其进行更新,然后使用泛型将其发送到更新函数。

我正面临一个奇怪的问题,我不知道它是否与Realm或泛型相关。您的帮助将不胜感激

设置: 从GenericObject Realm继承的一个类Object和一个名为Sale的子类:

GenericObject: Object 

Sale: Generic Object  // This class includes a primary key called "id"

我从网络上获取了一个Sale对象,并且能够将其保存在Realm中,从而在写事务之外创建了一个新对象(我可以保存它而不必担心写事务,但是我想使用相同的代码和流程进行更新)

当我修改对象的属性并尝试更新Realm时,它会引发异常,因为找不到主键。 (primaryKey在子类Sale中定义)

我已经能够按照以下方式将问题精确定位到newItem()中的Sale方法中:

override func newItem<T:GenericObject>(ofType itemType: T.Type) -> T {
    let dictionary = self.getDictionary()
    let newItem = T.init()
    newItem.updateWithDictionary(dict: dictionary)
    print("Type: \(type(of: newItem)) - Object: \(newItem)")
    return newItem
}

然后,我将其称为:

let newObject = object.newItem(ofType: Sale.self)
self.realm.add(newObject, update: true)

到目前为止,太好了。我从网络上检索对象,并且可以正常工作。 print()报告type(of:)的实例化对象是Sale,并且该对象的打印输出还显示Sale

Type: Sale - Object: Sale { .... 

当我更新并保存对象时,它无法说Realm找不到主键,type(of:)报告了Sale,但是实例被打印为{{1 }}超类,如下所示:

GenericObject

此结果运行相同的代码并执行相同的代码。我正在将Xcode 10和Swift 4.2与Realm 3一起使用 知道这里可能发生什么吗?

1 个答案:

答案 0 :(得分:0)

六个月后,问题似乎已经解决,而没有清楚说明正在发生什么。

截至2019年4月22日,已迁移到Realm 3.14.1,Xcode 10.2.1和Swift 5.0,我能够使用T.init()获取对象的克隆,并将其成功保存到领域使用我发布问题时使用的原始代码编写事务

我没有看到任何与从Swift 4.2到5.0的语法更改相关的信息,但是我知道Xcode 10.2.1包括对LLVM / clang的更新。

我很想花一些时间检查以前Realm版本的新编译器