返回Result <object>时,Realmswift泛型函数调用崩溃

时间:2017-08-07 11:05:24

标签: ios swift generics realm

我已经构建了一个通用函数来从领域获取任何类型的数据,这似乎工作正常。

 func getData<T: Object>(withFilter: String) -> Results<T>? {
    if !checkRealm(){return nil}
    return realm!.objects(T.self).filter(withFilter)
}

我无法弄清楚如何使用此功能删除数据。 我的删除功能如下:

    func removeData(withFilter: String) {

        let dataToDelete: Results<Object>? = getData(withFilter: withFilter)
        // *** The above line crashes the app ***

        if let dataToDeleteUnwrapped = dataToDelete{
            try? realm!.write {
                realm!.delete(dataToDeleteUnwrapped)
            }
    }
}

这会导致错误,如下所示。虽然Results<Object>?崩溃了应用,但Results<MyCustomObject>?工作正常,但我的删除数据功能不再是通用的。

Terminating app due to uncaught exception 'RLMException', reason: 'Object type 'RealmSwiftObject' is not managed by the Realm. If using a custom `objectClasses` / `objectTypes` array in your configuration, add `RealmSwiftObject` to the list of `objectClasses` / `objectTypes`.'

我确信有一个很好的简短方法可以解决这个问题,但我无法想象它,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

Results无法保存多个类的实例,其所有元素必须来自同一类型,因此Results<Object>不是集合的有效类型。

您当前的getData实施是错误的。您不能在函数中的任何位置使用泛型类型T。应该为泛型函数的输入参数提供通用类型。您需要对继承自getData的特定removeData类型调用RealmObject,因为Result只能包含一种类型且所有类型都有唯一属性,因此您只能对特定类型使用谓词。

这是getData的正确通用实现,用于查询具有给定谓词的特定类的Realm

func getData<T:Object>(ofType: T.Type, withFilter: String) -> Results<T>? {
    if !checkRealm(){return nil}
    return realm!.objects(T.self).filter(withFilter)
}

你这样称呼它(以下示例已经过测试,并且正在使用Realm网站的示例项目中的游乐场):

let people = getData(ofType: Person.self, withFilter: "cars.@count > 1 && spouse != nil")
people?.first?.name //prints Jennifer when called after adding the objects to realm, but before deleting them in the example project

了解如何在具有类型约束的Realm上使用泛型函数,您也应该能够更新删除函数。

答案 1 :(得分:0)

使用此扩展程序将结果转换为真实对象

  extension Results {
        func toArray<T>(ofType: T.Type) -> [T] {
            var array = [T]()
            for i in 0 ..< count {
                if let result = self[i] as? T {
                    array.append(result)
                }
            }
            return array
        }
    }

如何在代码中使用

   let orjObjs = realm.objects(UrObj.self).toArray(ofType: UrObj.self) as [UrObj]