Каким требованиям должен соответствовать тип, чтобы быть ключом в Dictionary?

«Каким требованиям должен соответствовать тип, чтобы быть ключом в Dictionary?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Что это означает на практике:

  • Тип должен уметь генерировать целочисленный хеш (hashValue) через метод hash(into:).
  • Тип должен реализовывать оператор == для проверки равенства (часть протокола Equatable, от которого наследует Hashable).

Примеры типов, которые уже являются Hashable и готовы к использованию:

  • Все базовые типы: Int, String, Bool, Double и т.д.
  • Типы Optional, Array, Dictionary, Set, если их элементы Hashable.
  • Перечисления (enum) без ассоциированных значений или со значениями Hashable типов.

Как сделать пользовательский тип ключом: Для структур и перечисмов Swift часто синтезирует соответствие Hashable автоматически. Для классов его нужно реализовать вручную (см. предыдущий вопрос).

// Swift автоматически делает эту структуру Hashable
struct Coordinate: Hashable {
    let x: Int
    let y: Int
}

var terrain: [Coordinate: String] = [:
terrain[Coordinate(x: 10, y: 20)] = "Mountain"

// Перечисление также может быть ключом
enum AppState: Hashable {
    case active, background, suspended
}
var stateHandlers: [AppState: () -> Void] = [: