Ответ
Comparable — это протокол в Swift, который наследуется от Equatable и описывает типы, значения которых можно сравнивать с помощью операторов упорядочивания (<, <=, >, >=). Он является основой для стандартных операций сортировки, поиска минимума/максимума и работы с диапазонами.
Требования протокола:
Для соответствия протоколу тип должен реализовать только оператор < (static func < (lhs: Self, rhs: Self) -> Bool). Компилятор Swift автоматически синтезирует реализации для остальных операторов сравнения (<=, >, >=) на основе < и == из Equatable.
Пример реализации для пользовательской структуры:
struct Person: Comparable {
let name: String
let age: Int
// Требуемая реализация для Comparable
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)]
let youngest = people.min() // Bob(25)
Ключевые принципы:
- Реализация оператора
<должна быть строгой, транзитивной и согласованной с==. - Поскольку
ComparableнаследуетEquatable, тип автоматически получает возможность проверки на равенство (==). Если все свойства соответствуютEquatable, реализацию==можно не писать — компилятор сгенерирует ее сам.