Выведение Hashable/Equatable/Comparable
Позвольте Swift синтезировать Equatable/Hashable (и Codable) для простых структур и перечислений; при необходимости реализуйте пользовательский Comparable (лексикографический) и ручной hash(into:) .
«Выведение Hashable/Equatable/Comparable» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Что синтезируется?
Swift может синтезировать распространённые соответствия протоколам для простых типов:
- Сопоставимость: равенство значений;
- Хешируемость: ключи словарей и множеств;
- Кодируемость: кодирование и декодирование.
Реализуйте сравнимость самостоятельно (лексикографически) или используйте порядок вариантов перечисления, когда это применимо.
Синтез для структур
Для структур, чьи хранимые свойства поддерживают сопоставимость и хешируемость, Swift автоматически создаёт оба соответствия.
struct Point: Equatable, Hashable {
var x: Int
var y: Int
// No extra code: Equatable & Hashable are synthesized
}
let p1 = Point(x: 1, y: 2)
let p2 = Point(x: 1, y: 2)
print(p1 == p2) // true
let set: Set<Point> = [p1, p2] // Hashable works; duplicates coalesce
print(set.count) // 1Сравнимость для перечислений
Перечисление без связанных значений может получить синтез сравнимости на основе порядка вариантов.
enum Priority: Comparable { case low, medium, high }
// Comparable is synthesized using case order: low < medium < high
print(Priority.low < .high) // trueСравнимость для структур
Для структур вручную реализуйте <. Часто используется простое лексикографическое сравнение (сначала last, затем first).
struct Person: Comparable, Hashable {
let last: String
let first: String
static func < (lhs: Person, rhs: Person) -> Bool {
if lhs.last != rhs.last { return lhs.last < rhs.last }
return lhs.first < rhs.first
}
}
let a = Person(last: "Doe", first: "Ana")
let b = Person(last: "Doe", first: "Max")
print(a < b) // true (Ana before Max)Пользовательское равенство и хеширование
Реализуйте == и hash(into:), если при проверке равенства и хешировании нужно игнорировать форматирование (например, регистр и пробелы).
struct FileID: Hashable, Equatable {
let path: String
// Normalize case/trim when hashing & comparing
static func == (l: FileID, r: FileID) -> Bool {
l.path.lowercased().trimmingCharacters(in: .whitespaces) ==
r.path.lowercased().trimmingCharacters(in: .whitespaces)
}
func hash(into hasher: inout Hasher) {
hasher.combine(path.lowercased().trimmingCharacters(in: .whitespaces))
}
}
let f1 = FileID(path: " Readme.md ")
let f2 = FileID(path: "readme.md")
print(f1 == f2) // true
print(Set([f1, f2]).count) // 1Рекомендации
Советы:
- Согласуйте == и hash(into:): равные значения должны иметь одинаковый хеш.
- Сначала предпочитайте синтез, а к ручной реализации переходите только для пользовательской семантики.
- Документируйте правила упорядочивания для сравнимости.
- Используйте перечисления без данных, когда достаточно простой упорядоченной шкалы.
Проверка синтеза
Быстрая проверка: что Swift может автоматически синтезировать для простых структур и перечислений?
Повторение
Повторение: позволяйте Swift синтезировать сопоставимость/хешируемость (а также кодируемость) для простых моделей. Реализуйте сравнимость с ясными лексикографическими правилами или по возможности используйте порядок вариантов перечисления.
Часто задаваемые вопросы
Урок «Выведение Hashable/Equatable/Comparable» бесплатный?
Да — полный текст урока «Выведение Hashable/Equatable/Comparable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Выведение Hashable/Equatable/Comparable»?
Позвольте Swift синтезировать Equatable/Hashable (и Codable) для простых структур и перечислений; при необходимости реализуйте пользовательский Comparable (лексикографический) и ручной hash(into:) . Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Выведение Hashable/Equatable/Comparable»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Перегрузка операторов и группы приоритетов
- Сабскрипты и пользовательские индексы: повторение
- Выведение Hashable/Equatable/Comparable