Встречается на 27% собеседований по Mobile

Что такое Hashable

Протокол `Hashable` позволяет объекту быть использованным в качестве ключа в словаре (`Dictionary`) или элемента в множестве (`Set`). Чтобы объект мог выполнять эту роль, он должен быть уникально идентифицируемым, чтобы каждый экземпляр объекта мог быть сравним с другими экземплярами и иметь уникальное хэш-значение. Это требование обеспечивается реализацией двух требований протокола: `Equatable` и `hash(into:)`.

Equatable

Это протокол, который требует от типов предоставить реализацию оператора равенства (`==`), позволяя сравнивать два экземпляра данного типа. Для использования в качестве ключа словаря или элемента множества объекты должны поддерживать возможность такого сравнения на равенство.

hash(into:)

Позволяет объекту добавлять своё состояние к `Hasher`, который является структурой, предоставляющей унифицированный интерфейс для вычисления хэш-значений. Правильно реализованный хэш учитывает все значимые свойства объекта, которые также используются в сравнении на равенство.

Пример:

text
```swift
struct Person: Hashable {
    var name: String
    var age: Int
    
    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(age)
    }
}
```

В этом примере `Person` структура реализует `Hashable`, предоставляя реализации для `==` и `hash(into:)`. Это позволяет использовать `Person` в качестве ключей в `Dictionary` или элементов в `Set`.

Данный протокол необходим для:

  • Использования объектов в качестве ключей словаря. Эффективный поиск и доступ к элементам словаря требуют уникального идентификатора для каждого ключа.
  • Включения объектов в множество. Множества (`Set`) гарантируют уникальность своих элементов, что требует возможности сравнения этих элементов на равенство и вычисления их хэш-значений.

`Hashable` делает возможным эффективное хранение и поиск данных, используя хэш-таблицы, что является основой для `Dictionary` и `Set`.

April 10, 2024, easyoffer

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы