我认为在阅读here和here之后这会非常简单,但我有点卡住了。
我有一个'favouriteWorkout'对象,如下所示:
class FavouriteObject: Object {
@objc dynamic var favouriteWorkoutName = ""
@objc dynamic var workoutReference = WorkoutSessionObject()
override class func primaryKey() -> String? {
return "favouriteWorkoutName"
}
}
我在这里尝试做的是在Realm中引用WorkoutSessionObject
,当锻炼被保存为收藏时,它会从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"
}
}
然后我尝试使用此保存:
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")
}
但是当我跑步时发生了崩溃:
'RLMException',原因:'
FavouriteObject.workoutReference
属性必须标记为可选。
但是,当我尝试将其设为可选(通过添加?)时,它会显示
“不能对'WorkoutSessionObject'类型的非可选值使用可选链接!
摘要
我想在workoutID
中保存WorkoutSessionObject
FavouriteObject
的引用,这是WorkoutSessionObject
的实际链接(因此可以从收藏)
更新
使用下面的答案我现在已经分类了锻炼参考的问题。现在,它在Realm中显示为“workoutReference”下的正确格式()。但是,在尝试保存时,我现在在“workoutReference”中获得“nil”。我知道,当我在控制台中打印它时,workoutID正确显示。
答案 0 :(得分:2)
在property-cheatsheet中,您可以看到不允许使用非可选Object
- 属性,因此您必须按以下方式更改它:
class FavouriteObject: Object {
@objc dynamic var favouriteWorkoutName = ""
// here you have to make the property optional
@objc dynamic var workoutReference: WorkoutSessionObject?
override class func primaryKey() -> String? {
return "favouriteWorkoutName"
}
}
答案 1 :(得分:1)
您需要更改workoutReference
的声明。首先,您需要在类型之后编写Optional
来使其?
。其次,您不应为其指定默认值,因此需要Optional
。 linked docs明确指出
一对一关系必须是可选的
,workoutReference
显然是一对一的关系。
class FavouriteObject: Object {
@objc dynamic var favouriteWorkoutName = ""
@objc dynamic var workoutReference:WorkoutSessionObject?
override class func primaryKey() -> String? {
return "favouriteWorkoutName"
}
}