Я пытаюсь реализовать удобную Collection.sorted(by: KeyPath)
функцию.
Пока все работает, если сделать
func sorted<T: Comparable>(by keyPath: KeyPath<Element, T>) -> [Element] {
return sorted { lhs, rhs
return lhs[keyPath: keyPath] < rhs[keyPath: keyPath]
}
}
Но что, если я хочу разрешить вызывающей стороне указывать фактические логи сортировки c? Я добавил функцию обратного вызова, чтобы выполнить сравнение, вот так (черпая вдохновение из оригинальной sorted(_:)
сигнатуры функции).
func sorted<T: Comparable>(by keyPath: KeyPath<Element, T>, _ compare: (T, T) throws -> Bool) rethrows -> [Element] {
return try sorted { lhs, rhs in
return try compare(lhs[keyPath: keyPath], rhs[keyPath: keyPath])
}
}
Теперь, это все работает, но это означает, что место вызова всегда должно указывать, какой выполнить операцию сортировки.
let sorted = myArray.sorted(by: \.name, <)
Я бы хотел, чтобы по умолчанию она была <
, но как я могу ссылаться на оператор <
по умолчанию в сигнатуре моей функции?