Я выбираю сущности из Core Data в SwiftUI и хотел бы отсортировать их так:
- Если есть следующая дата, сортируйте их по возрастанию
- Под теми, у которых есть по следующей дате отсортировать оставшиеся по дате создания
У меня есть:
@FetchRequest(entity: MyEntity.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: \MyEntity.nextDate, ascending: true),
NSSortDescriptor(keyPath: \MyEntity.dateCreated, ascending: true)
]) private var entities: FetchedResults<MyEntity>
Проблема в том, что те, у которых нет следующей даты, все сортируются выше тех, которые имеют следующая дата не равна нулю, как видно из этого другого вопроса .
Я пытался создать подкласс NSSortDescriptor
, чтобы переместить nil
значения в конец, но он никогда не вызывает ни одного из переопределенные функции.
final class NilsLastSortDescriptor: NSSortDescriptor {
override func copy(with zone: NSZone? = nil) -> Any {
return NilsLastSortDescriptor(key: self.key, ascending: self.ascending, selector: self.selector)
}
override var reversedSortDescriptor: Any {
return NilsLastSortDescriptor(key: self.key, ascending: !self.ascending, selector: self.selector)
}
override func compare(_ object1: Any, to object2: Any) -> ComparisonResult {
if (object1 as AnyObject).value(forKey: self.key!) == nil && (object2 as AnyObject).value(forKey: self.key!) == nil {
return .orderedSame
}
if (object1 as AnyObject).value(forKey: self.key!) == nil {
return .orderedDescending
}
if (object2 as AnyObject).value(forKey: self.key!) == nil {
return .orderedAscending
}
return super.compare(object1, to: object2)
}
}
Я также пытался использовать NSSortDescriptor
API, который включает в себя блок компаратора, однако это происходит сбой с
Исключение: «неподдерживаемый NSSortDescriptor (блоки компаратора не поддерживается) "
Как можно добиться желаемого поведения сортировки?