Вопрос проверяет знание протокола Hashable и его связи с Equatable.
Hashable наследуется от Equatable, потому что:
Если два объекта равны (==), их хэши должны совпадать.
Обратное необязательно (коллизии возможны).
Чтобы использовать тип (структуру или класс) как ключ в Dictionary или элементом Set, он должен соответствовать протоколу Hashable.
Связь с Equatable:
Hashable требует реализации == (из Equatable), так как:
Если a == b, то a.hashValue == b.hashValue.
Но одинаковые хэши не гарантируют равенство объектов (коллизии).
Пример:
struct User: Hashable {
let id: Int
let name: String
}
// Swift автоматически синтезирует `hash(into:)` и `==`, если все поля тоже Hashable.Вывод:
Реализация Hashable обязательна для ключей в Dictionary. Если поля структуры уже поддерживают Hashable, компилятор сгенерирует код автоматически.