0Pricing
Swift Academy · Урок

Синтезированный Equatable

Получайте == автоматически и настраивайте его при необходимости.

«Синтезированный Equatable» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое сравнимость

Equatable — это протокол, который предоставляет оператор == для типа. Соответствие этому протоколу позволяет сравнивать два значения на равенство и использовать их с contains, firstIndex и другими операциями.

Автоматическое соответствие

Для структуры, все хранимые свойства которой поддерживают сравнение, Swift синтезирует для Вас == — достаточно объявить соответствие протоколу:

struct Point: Equatable {
    let x: Int
    let y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))  // true
print(Point(x: 1, y: 2) == Point(x: 9, y: 2))  // false

Как работает синтез

Сгенерированный == попарно сравнивает все хранимые свойства. Чтобы значения считались равными, равными должны быть все свойства:

struct User: Equatable {
    let name: String
    let age: Int
}
let a = User(name: "Ann", age: 30)
let b = User(name: "Ann", age: 31)
print(a == b)  // false  (age differs)

Использование == в коллекциях

Equatable открывает доступ ко многим операциям над массивами:

struct Tag: Equatable { let name: String }
let tags = [Tag(name: "a"), Tag(name: "b")]
print(tags.contains(Tag(name: "b")))        // true
print(tags.firstIndex(of: Tag(name: "a"))!) // 0

Перечисления тоже поддерживают сравнение

Для перечислений также синтезируется Equatable. Перечисления без ассоциированных значений поддерживают сравнение даже без явного объявления этого соответствия; для перечислений с ассоциированными значениями нужно объявить соответствие, и эти значения тоже будут сравниваться.

Сравнимое перечисление с ассоциированными значениями

Ассоциированные значения участвуют в сравнении:

enum Status: Equatable {
    case active
    case error(code: Int)
}
print(Status.error(code: 404) == Status.error(code: 404))  // true
print(Status.error(code: 404) == Status.error(code: 500))  // false

Вложенные типы

Синтез является композиционным: структура, содержащая сравнимые элементы, также может получить синтезированное соответствие:

struct Line: Equatable {
    let start: Int
    let end: Int
}
struct Shape: Equatable {
    let lines: [Line]
}
print(Shape(lines: [Line(start: 0, end: 1)]) == Shape(lines: [Line(start: 0, end: 1)]))  // true

Когда синтез невозможен

Если какое-либо хранимое свойство не поддерживает сравнение, синтез недоступен, и Вам нужно самостоятельно написать == (это будет рассмотрено далее):

struct Box: Equatable {
    let id: Int
    static func == (l: Box, r: Box) -> Bool { l.id == r.id }
}
print(Box(id: 1) == Box(id: 1))  // true

Для классов автоматического синтеза нет

Ссылочные типы не получают синтезированный ==; Вам нужно реализовать его самостоятельно, сравнивая идентичность или поля:

final class Account: Equatable {
    let id: Int
    init(id: Int) { self.id = id }
    static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 7) == Account(id: 7))  // true

!= предоставляется автоматически

После появления == оператор != автоматически выводится как его отрицание:

struct Color: Equatable { let hex: String }
print(Color(hex: "#fff") != Color(hex: "#000"))  // true

Сравнение в обобщённом коде

Equatable позволяет обобщённым функциям сравнивать элементы — его требуют многие алгоритмы:

func allSame<T: Equatable>(_ xs: [T]) -> Bool {
    guard let first = xs.first else { return true }
    return xs.allSatisfy { $0 == first }
}
print(allSame([2, 2, 2]))  // true
print(allSame(["a", "b"]))  // false

Быстрая проверка

Для какого типа Swift автоматически синтезирует ==, если объявить Equatable?

Итоги

Вы изучили Equatable:

  • Equatable предоставляет == (и бесплатный !=)
  • Структуры и перечисления с поддерживающими сравнение элементами получают синтезированный ==
  • Становятся доступны contains, firstIndex(of:) и другие операции
  • Для классов и элементов, не поддерживающих сравнение, требуется реализовать == вручную

Далее: хешируемость.

Часто задаваемые вопросы

Урок «Синтезированный Equatable» бесплатный?

Да — полный текст урока «Синтезированный Equatable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Синтезированный Equatable»?

Получайте == автоматически и настраивайте его при необходимости. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Синтезированный Equatable»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Синтезированный Equatable
  2. Hashable и hash(into:)
  3. Comparable и сортировка
  4. Пользовательская семантика равенства
← Назад к Swift Academy