Swift: сортировка массива основных данных в функции

#arrays #swift #sorting #core-data

#массивы #swift #сортировка #core-data

Вопрос:

У меня есть массив объектов из основных данных, которые я хотел бы отсортировать в функции в дочернем представлении. Я знаю, как сортировать с помощью .sorted(by:{}) , но проблема заключается в том, чтобы присвоить отсортированному массиву обратно переменную ObservedObject, чтобы пользовательский интерфейс обновлялся с отсортированными данными.

В приведенном ниже коде, когда я пытаюсь это сделать habits = habits.sorted(by:{}) , я получаю следующие ошибки:

  1. Невозможно присвоить свойству: ‘self’ является неизменяемым
  2. Отметьте метод ‘mutating’, чтобы сделать ‘self’ изменяемым
  3. Не удается присвоить значение типа ‘[FetchedResults.Элемент]’ (он же ‘Array’) для ввода ‘FetchedResults’

Кто-нибудь знает лучший способ сделать это или как устранить ошибку?

 struct ContentView: View {
    @Environment(.managedObjectContext) var moc
    @FetchRequest(entity: Habit.entity(), sortDescriptors: [NSSortDescriptor(keyPath: Habit.id, ascending: true)]) var habits: FetchedResults<Habit>
    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(habits, id: .self) { habit in
                        VStack(alignment: .leading) {
                            Text(habit.title)
                            HStack {
                                ForEach(habit.dayArray.count-7..<habit.dayArray.count, id: .self) { index in
                                    DayView(day: habit.dayArray[index], habits: self.habits)
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    struct DayView: View {
        @Environment(.managedObjectContext) var moc
        @ObservedObject var day: Day
        var habits: FetchedResults<Habit>
        var body: some View {
            Text(“(day.wrappedShort)“).onTapGesture {
                self.sortHabits(day: self.day)
            }
        }
        func sortHabits() {
            self.habits = habits.sorted{ $0.title.uppercased() < $1.title.uppercased() }
        }
    }
}
  

Комментарии:

1. Вместо этого добавить NSSortDescriptor к вашему запросу на выборку?

2. Ваши параметры сортировки странные, они принимают параметр, который не используется, и вызов moc.save() не окажет никакого влияния на порядок сортировки, если это то, во что вы верите

3. Спасибо Joakim, re: NSSortDescriptor, я пробовал это, но я хочу отсортировать после выборки. Приложение, которое я создаю, предназначено для проверки ежедневных привычек, поэтому, как только пользователь отметил привычку на день, я хочу, чтобы эта привычка находилась в нижней части списка.

4. Re: функция sortHabits, я попытался максимально упростить блок кода для своего вопроса, но случайно оставил эти несоответствия. Сейчас я обновлю исходный код вопроса.

5. Но если вы обновите одну привычку, не будет ли @fetchRequest обновляться автоматически?