2016-06-01 1 views
1

가끔개체를 정렬해야합니다 (예 : 사용자가 Workout을 순서에 따라 추가하지 않는 경우). 그러나 새 정렬 된 개체를 얻을 수없는 것 같습니다. List<Workout> 지속된다. 내 코드는 실행되는 즉시 작동합니다 (즉, 정렬 된 뷰에 표시됨).하지만 ViewController를 종료하거나 앱을 다시 시작하면 아무 것도 볼 수 없습니다. 그 어떤 것도 지속될 것이므로 이지만, exercise.workoutDiary = sortedWorkoutDiary에 대한 후속 할당은 지속되지 않습니다. 어떤 아이디어?대체 됨 <T> 개체가 Realm에서 일관되게 지속되지 않음

다른 모든 기능은 정상적으로 작동합니다. 일반적인 recordWorkout() 사례는 아무 것도 주문하지 않은 것으로 가정하고 작동합니다. 따라서 정렬 된 List를 덮어 쓰는 것을 제외하고 거의 모든 경우에서 지속됩니다.

업데이트

여기서 발생합니다 영역 스위프트의

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

관련 문제