2016-06-01 5 views
1

私はList<Workout>オブジェクトを並べ替える必要があります(たとえば、ユーザーがワークアウトを順不同で追加するなど)がありますが、新しい並べ替えを取得できないようですList<Workout>存続する。私のコードは実行時に動作します(つまり、ソートされたビューに表示されます)が、ViewControllerを終了するかアプリを再起動すると何も表示されません。何もないのは、exercise.workoutDiary.removeAll()が持続するためですが、明らかに、exercise.workoutDiary = sortedWorkoutDiaryへのその後の割り当ては維持されません。なぜどんなアイデア?リスト<T>オブジェクトが一貫してレルム内に永続しない

他のすべてはうまく動作します。典型的な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>() 
} 

答えて

4

List<T>レルムスウィフトのプロパティが割り当てられていない、場所に変異しなければなりません。 Swiftランタイムは、Realmが汎用タイプのプロパティへの代入をインターセプトする方法を提供していません。代わりに、あなたはList<T>を変異させるappendContentsOf(_:)のようなメソッドを使用する必要があります。

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

ジェネリック型のプロパティへの代入のこの制限は、なぜレルムスウィフトドキュメントrecommends that you declare such properties using let rather than varです。これにより、Swiftコンパイラはこの種の間違いをキャッチできます。

あなたのsortedWorkouts計算プロパティでは、代わりにList<Workout>を割り当てて入力するのを避けるために、Results<Workout>を返すことをお勧めします。

+0

これは意味があります。 appendContentsOf(_ :)を使用するようにコードを変更しました。私はまた、結果のにsortedWorkoutsの計算されたプロパティタイプを切り替えることを試み、それは動作しませんでした。その場合は何も保存されません。タイプリストはまだ正常に動作します。 – briancl

関連する問題