У меня есть модель, которая выглядит примерно так
@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]
Что я делаю не так?
@Alexander Это приведет к еще одной ошибке, которую TodoTask должен соответствовать NSObject :(. Я думаю, это потому, что SortDescriptor использует NSSortDescriptor под капотом.
@JoakimDanielson Интересно. Использует ли SwiftData среду выполнения Objective C так же, как CoreData? Я никогда не использовал его раньше.
@Alexander Нет, я в это не верю, но под капотом он использует Core Data. Однако обратите внимание, что SortDescriptor — это не SwiftData, а тип Foundation.





Насколько я вижу, вы не делаете что-то не так, и это должно быть исправлено в 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))
}
Что произойдет, если вы укажете порядок явно?
SortDescriptor(\TodoTask.isDone, order: .forward)