Сортировка по логическому полю

У меня есть модель, которая выглядит примерно так

@Model
class TodoTask {
    var title: String
    var isDone: Bool
    var expectedOn: Date
}

Я хочу визуализировать список задач так, чтобы при isDone == true элемент появлялся внизу списка.

У меня есть привязка запроса, аналогичная приведенной ниже, но логические ошибки поля: «Нет точных совпадений при вызове инициализатора»

@Query(sort: [SortDescriptor(\TodoTask.expectedOn, order: .reverse), SortDescriptor(\TodoTask.isDone )]) var todoTasks: [TodoTask]

Что я делаю не так?

Что произойдет, если вы укажете порядок явно? SortDescriptor(\TodoTask.isDone, order: .forward)

Alexander 30.09.2023 23:45

@Alexander Это приведет к еще одной ошибке, которую TodoTask должен соответствовать NSObject :(. Я думаю, это потому, что SortDescriptor использует NSSortDescriptor под капотом.

Joakim Danielson 30.09.2023 23:46

@JoakimDanielson Интересно. Использует ли SwiftData среду выполнения Objective C так же, как CoreData? Я никогда не использовал его раньше.

Alexander 30.09.2023 23:47

@Alexander Нет, я в это не верю, но под капотом он использует Core Data. Однако обратите внимание, что SortDescriptor — это не SwiftData, а тип Foundation.

Joakim Danielson 30.09.2023 23:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я вижу, вы не делаете что-то не так, и это должно быть исправлено в SwiftData. Обходной путь на данный момент, который, к сожалению, потребует более сложного решения, будет

Удалите свойство isDone из запроса.

@Query(sort: [SortDescriptor<TodoTask>(\.expectedOn, order: .reverse)]) var todoTasks: [TodoTask] = []

Добавьте вычисляемое свойство TodoTask, которое можно использовать, например, для сортировки.

var isDoneSort: UInt8 {
    isDone ? 1 : 0
}

а затем добавьте новое свойство массива для сортировки и используйте этот новый массив в своем представлении вместо свойства запроса.

var sortedTasks: [TodoTask] {
    todoTasks.sorted(using: KeyPathComparator(\TodoTask.isDoneSort))
}

Другие вопросы по теме