Что такое протокол Comparable в Swift?

«Что такое протокол Comparable в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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, реализацию == можно не писать — компилятор сгенерирует ее сам.