Для чего используется протокол Comparable в Swift?

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

Ответ

Протокол 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)]