Синтезированный 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 — локальная установка не требуется.
Все уроки этого курса
- Синтезированный Equatable
- Hashable и hash(into:)
- Comparable и сортировка
- Пользовательская семантика равенства