簡體   English   中英

如何正確使用Swift中的generics在Realm的列表中存儲不同類型的對象?

[英]How to properly use generics in Swift to store different types of objects in a list in Realm?

我遇到了 Realm 引發的錯誤,指出我的“類別”類型不受 Realm 管理。

對於上下文,“類別”可以包含“錯誤”或“主題”類型的集合。 “主題”還可以包含“類別”的集合,其中包含“錯誤”的集合。 因此,我使用的是 generics,這樣我就不必創建兩個單獨的數據模型來對這兩個數據模型進行分組。

class Category<O:Object>:Object{

//properties
@objc dynamic var categoryName:String = ""

//relationships
let ChildObjects = List<O>() //type of child object is to be set by the generic type; two possible types: subjects & mistakes

//mother objects
var Subjects = LinkingObjects(fromType: Subject.self, property: "MistakeCategories") //For Mistake Categories

}

我使用以下代碼加載了一類主題的結果:

var CategoryDatabase:Results<Category<Subject>>!

CategoryDatabase = R.objects(Category<Subject>.self)

我也嘗試過使用以下代碼:

var CategoryDatabase:Results<Category<Subject>>!

CategoryDatabase = R.objects(Category.self)

盡管如此,我遇到了以下錯誤。

*** Terminating app due to uncaught exception 'RLMException', reason: 'Object type '_TtGC8Go_For_A8CategoryCSo16RealmSwiftObject_' not managed by the Realm'

我試圖在互聯網上搜索可能的解決方案,但他們的問題與我的不完全相同。 盡管如此,我發現可能是我為什么會收到錯誤的一個可能答案。 但是,錯誤及其原因是不同的。

這是我的通用 function 在將不同類型的對象存儲到 Realm 數據庫時正常工作:

let realm = try! Realm()

func createObject<T: Object>(_ object: T) {
     do {
         try realm.write {
             realm.add(object)
           }
        } catch {
             print(error)
           }
        }

這行不通

let ChildObjects = List<O>() //...two possible types: subjects & mistakes

Realm Collections (結果,列表)是同質的,只能存儲一個 object 類型的零個或多個實例; 例如,您不能在同一個列表 object 中存儲不同類別的 Object

Generics 很棒,但是當您處理不同的(可能不相關的)對象、主題和錯誤時,使用泛型可能是錯誤的方法,因為查詢和實際數據會完全不同。

將您的數據分開

let subjects = List<SubjectClass>()

let mistakes = List<MistakeClass>()

的如果有一些連接使它成為一個 class

class SubjectClass: Object {
    @objc dynamic var subject_name = ""
    @objc dynamic var is_mistake = false
}

如果一個主題可以有很多錯誤

class SubjectClass: Object {
    @objc dynamic var subject_name = ""
    let allMyMistakes = List<MistakeClass<>
}

有關一些數據建模信息,請查看此答案,然后在此處查看@DávidPásztor 的精彩答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM