Realm Swift - 保存对另一个对象的引用

nc1*_*c14 3 realm ios swift

我认为阅读完此处此处后这会非常简单,但我有点卡住了。

我有一个“favouriteWorkout”对象,如下所示:

class FavouriteObject: Object {
    @objc dynamic var favouriteWorkoutName = ""
    @objc dynamic var workoutReference = WorkoutSessionObject()

    override class func primaryKey() -> String? {
        return "favouriteWorkoutName"
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里尝试做的是WorkoutSessionObject在将锻炼保存为收藏夹时引用 Realm 中的 a,该链接来自 WorkoutName。

我的 WorkoutSessionObject 有一个主键,workoutID它是一个UUID字符串。它看起来像这样:

class WorkoutSessionObject: Object {
    @objc dynamic var workoutID = UUID().uuidString
    @objc dynamic var workoutType = ""
    let exercises = List<WorkoutExercise>()
    @objc dynamic var totalExerciseCount = 0
    @objc dynamic var rounds = 0
    @objc dynamic var favourite : Bool = false

    override class func primaryKey() -> String? {
        return "workoutID"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下方法保存:

let favouriteWorkout = FavouriteObject()
favouriteWorkout.favouriteWorkoutName = favouriteName
favouriteWorkout.workoutReference = (realm.object(ofType: WorkoutSessionObject.self, forPrimaryKey: self.workoutID))!

do {
    try realm.write {
        realm.add(favouriteWorkout)
    }
} catch {
    print ("Error adding favourite")
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行时我会崩溃:

'RLMException',原因:'该FavouriteObject.workoutReference属性必须标记为可选。

但是,当我尝试将其设为可选(通过添加?)时,它说

“不能对‘WorkoutSessionObject’类型的非可选值使用可选链!

概括

我想在 my 中保存workoutIDa的引用,这是指向 the 的实际链接(因此可以从收藏夹访问属性)WorkoutSessionObjectFavouriteObjectWorkoutSessionObject

更新

使用下面的答案,我现在已经解决了锻炼参考的问题。现在,这在 Realm 中显示为“workoutReference”下的正确格式 ()。但是,当我尝试保存时,我现在在“workoutReference”中得到“nil”。当我在控制台中打印锻炼 ID 时,我知道它是正确的。

Dáv*_*tor 6

您需要更改 的声明workoutReference。首先,你需要在type后面Optional写上它。其次,您不应该为其分配默认值,它需要有一个原因。链接的文档明确指出?Optional

一对一关系必须是可选的

,并且workoutReference显然是一对一的关系。

class FavouriteObject: Object {
    @objc dynamic var favouriteWorkoutName = ""
    @objc dynamic var workoutReference:WorkoutSessionObject?

    override class func primaryKey() -> String? {
        return "favouriteWorkoutName"
    }
}
Run Code Online (Sandbox Code Playgroud)