Вопрос проверяет понимание требований к типам ключей в Dictionary в Swift и механизмов быстрого поиска по ключу.
Hashable нужен, чтобы ключ помещался в хеш-таблицу и рассчитывался его хеш-код для быстрого доступа. Equatable — чтобы при коллизиях (одинаковые хеш-коды) можно было точно сравнить два ключа и выбрать нужный. Без этих протоколов словарь не сможет эффективно хранить и находить пары «ключ→значение».
Хеш-таблица под капотом:
Dictionary в Swift реализован как хеш-таблица.
Каждый ключ преобразуется в хеш-код (целое число), который указывает в какой «бакет» поместить значение.
Роль Hashable:
Протокол требует реализации метода hash(into:), куда объект записывает свои байты.
Стандартные типы (String, Int) уже соответствуют Hashable.
Без Hashable словарь не знает, как получить хеш-код вашего ключа.
Роль Equatable:
При совпадении хеш-кодов может быть несколько ключей в одном бакете.
Чтобы отличить их, словарь вызывает == (Equatable).
Без Equatable нельзя определить, какой из ключей именно нужен.
Пример определения ключа:
struct Person: Hashable {
let id: Int
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.id == rhs.id
}
}
var dict: [Person: String] = [:]
dict[Person(id: 1)] = "Alice"Вывод:
Соответствие Hashable и Equatable обеспечивает корректную и быструю работу словаря через хеш-таблицу и точное сравнение при коллизиях.