0Pricing
Swift Academy · Урок

Выведение 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 — локальная установка не требуется.

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

  1. Перегрузка операторов и группы приоритетов
  2. Сабскрипты и пользовательские индексы: повторение
  3. Выведение Hashable/Equatable/Comparable
← Назад к Swift Academy