Если вы хотите, чтобы ваши задачи хранились в упорядоченном виде, вам придется вручную выполнить упорядоченную вставку.
extension List {
func insert<V: Comparable>(_ object: Element, orderedBy keyPath: KeyPath<Element, V>) {
var index = 0
for i in 0..<count {
if self[i][keyPath: keyPath] >= object[keyPath: keyPath] {
break
}
index = i + 1
}
insert(object, at: index)
}
}
let list = TaskList()
let tasks = [
Task(title: "J"),
Task(title: "Z"),
Task(title: "T"),
Task(title: "J"),
Task(title: "Z"),
]
tasks.forEach {
list.tasks.insert($0, orderedBy: \.title)
}
Однако я считаю, что гораздо проще сохранять Lists
несортированными и извлекать отсортированные Results
всякий раз, когда мне нужно отобразить данные. Для сортировки по одному свойству просто позвоните sorted(byKeyPath:)
:
let sortedTasks = taskList.tasks.sorted(byKeyPath: "title")
Для сортировки по нескольким полям вызовите sorted(by:)
:
let sortedTasks = taskList.tasks.sorted(by: [
SortDescriptor(keyPath: "title"),
SortDescriptor(keyPath: "createdAt")
])
Кроме того, вы можете добавить отсортированное свойство к вашему Модель:
class TaskList: Object, Identifiable {
@objc dynamic var id = UUID().uuidString
@objc dynamic var title = ""
@objc dynamic var createdAt = Date()
var tasks = List<Task>()
lazy var sortedTasks: Results<Task> = tasks.sorted(byKeyPath: "title")
override class func ignoredProperties() -> [String] {
return ["sortedTasks"]
}
override static func primaryKey() -> String? {
return "id"
}
}