Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : hashable, set

Что нужно сделать, чтобы пользовательский тип можно было хранить в Set?

Вопрос проверяет понимание требований Set к элементам и умение корректно реализовывать протоколы сравнения и хеширования.

Короткий ответ

Чтобы пользовательский тип можно было хранить в Set, он должен соответствовать протоколу Hashable. Это означает, что тип должен корректно реализовывать сравнение на равенство и вычисление хеша. Хеш должен быть стабильным и согласованным с равенством. Если два объекта равны, их хеши тоже должны быть равны. В Swift для большинства типов это можно получить автоматически.

Длинный ответ

Set опирается на контракт Hashable, поэтому пользовательский тип обязан этот контракт соблюдать.

Основные требования к типу

Определение:
Тип считается Hashable, если он может быть:

  • корректно сравнен на равенство

  • преобразован в стабильное хеш-значение

Это два взаимосвязанных требования.

Реализация для структур

Для struct чаще всего достаточно:

  • чтобы все хранимые свойства были Hashable

  • объявить соответствие протоколу

struct User: Hashable {
    let id: Int
    let name: String
}

В этом случае компилятор:

  • автоматически сгенерирует ==

  • автоматически сгенерирует hash(into:)

Ручная реализация Hashable

Иногда требуется кастомная логика:

struct User: Hashable {
    let id: Int
    let name: String

    static func == (lhs: User, rhs: User) -> Bool {
        lhs.id == rhs.id
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

Здесь:

  • уникальность определяется только id

  • name не участвует в равенстве

Важное правило

Если свойство участвует в ==, оно обязательно должно участвовать и в hash(into:).

Нарушение этого правила приводит к некорректной работе Set.

Вывод

Чтобы пользовательский тип хранился в Set, он должен корректно реализовывать Hashable. Автоматическая генерация обычно достаточна, но при кастомной логике важно строго соблюдать контракт равенства и хеширования.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Swift

    Swift

Ключевые слова

#hashable

#set

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.