Ответ
Протокол Comparable наследуется от Equatable и позволяет определять порядок для экземпляров пользовательского типа с помощью операторов сравнения (<, <=, >, >=).
Основные сценарии использования:
- Сортировка коллекций. Методы
sorted(),sort()для массивов и других коллекций требуют, чтобы элементы былиComparable.let numbers = [5, 2, 8, 1] let sortedNumbers = numbers.sorted() // [1, 2, 5, 8] - Работа с алгоритмами и структурами данных, которые зависят от упорядочивания (например, бинарный поиск, нахождение минимума/максимума).
- Использование в условиях
if,guard,switch.if currentScore > highScore { highScore = currentScore } - Создание типов с естественным порядком (даты, версии, приоритеты).
Пример реализации для пользовательского типа:
struct Person: Comparable {
let name: String
let age: Int
// Требуется реализовать только оператор `<`.
// Остальные операторы (`<=`, `>`, `>=`) генерируются компилятором автоматически.
static func < (lhs: Person, rhs: Person) -> Bool {
return lhs.age < rhs.age
}
// Также требуется Equatable (можно использовать синтезированную реализацией).
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.age == rhs.age && lhs.name == rhs.name
}
}
let people = [Person(name: "Alice", age: 30), Person(name: "Bob", age: 25)]
let sortedByAge = people.sorted() // [Bob(25), Alice(30)]