gpt4 book ai didi

swift - 替换的 List 对象在 Realm 中不一致

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:11 24 4
gpt4 key购买 nike

我有一个 List<Workout>偶尔需要排序的对象(例如,如果用户乱序添加了锻炼),但我似乎无法获得新的排序 List<Workout>坚持。我的代码在它运行的那一刻就可以工作(即,它按排序显示在 View 上),但是当我退出 ViewController 或重新启动应用程序时,我什么也看不到。什么都没有是由于 exercise.workoutDiary.removeAll()坚持,但显然随后分配给 exercise.workoutDiary = sortedWorkoutDiary不坚持。有什么想法吗?

其他一切正常。典型 recordWorkout()案例工作假设没有输入乱序。因此,持久化在几乎所有情况下都有效,除了对已排序列表的覆盖。

更新发生在这里:

struct ExerciseDetailViewModel {

private let exercise: Exercise!

func recordWorkout(newWorkout: Workout) {
let lastWorkout = exercise.workoutDiary.last // grab the last workout for later comparison

let realm = try! Realm()
try! realm.write {
exercise.workoutDiary.append(newWorkout) // write the workout no matter what
}

if let secondToLastWorkout = lastWorkout { // only bother checking out of order if there is a last workout...
if newWorkout.date < secondToLastWorkout.date { // ...and now look to see if they are out of order
let sortedWorkoutDiary = exercise.sortedWorkouts
try! realm.write {
exercise.workoutDiary.removeAll()
exercise.workoutDiary = sortedWorkoutDiary
}
}
}
}
}

final class Exercise: Object {

var workoutDiary = List<Workout>()
var sortedWorkouts: List<Workout> {
return List(workoutDiary.sorted("date"))
}
}

final class Workout: Object {

dynamic var date = NSDate()
var sets = List<WorkSet>()
}

最佳答案

List<T> Realm Swift 中的属性必须就地改变,而不是分配给。 Swift 运行时不提供任何方式让 Realm 拦截对泛型类型属性的赋值。相反,您应该使用类似 appendContentsOf(_:) 的方法改变 List<T> :

exercise.workoutDiary.removeAll()
exercise.workoutDiary.appendContentsOf(sortedWorkoutDiary)

这种对泛型类型属性赋值的限制是 Realm Swift 文档 recommends that you declare such properties using let rather than var 的原因.这将使 Swift 编译器能够捕获这些类型的错误。

进一步说明:对于您的 sortedWorkouts计算属性,它最好返回 Results<Workout>而是为了避免分配和填充中间 List<Workout> .

关于swift - 替换的 List<T> 对象在 Realm 中不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37557872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com