Будет напечатано Optional("hi"). Одинаковый хеш не делает разные KeyObject равными: словарь дополнительно проверяет Equatable.
Какой вывод получит программа
Будет напечатано Optional("hi"). Одинаковый хеш не делает разные KeyObject равными: словарь дополнительно проверяет Equatable.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрите приведённый Swift‑код. Структура KeyObject реализует протокол Hashable, однако в методе hash(into:) всегда передаёт в хешер одно и то же значение, поэтому все её экземпляры будут иметь одинаковый хеш. Затем создаются два объекта‑ключа, в словарь помещается значение для первого из них, после чего происходит вывод этого же элемента.
struct KeyObject: Hashable {
let a: Int
func hash(into hasher: inout Hasher) {
hasher.combine(0)
}
}
let firstKey = KeyObject(a: 3)
let secondKey = KeyObject(a: 1)
var map: [KeyObject: String] = [:]
map[firstKey] = "hi"
print(map[firstKey])
Что будет напечатано?
Ответ
Будет напечатано Optional("hi"). Одинаковый хеш не делает разные KeyObject равными: словарь дополнительно проверяет Equatable.
Синтезированное равенство структуры сравнивает поле a, поэтому ключи со значениями 3 и 1 различаются. Постоянный хеш формально не нарушает правило «равные значения имеют одинаковый хеш», но создаёт коллизии и ухудшает производительность на большом наборе ключей. secondKey в коде вообще не используется. Результат обращения к Dictionary имеет optional-тип, поэтому обычный print показывает Optional("hi"), возможно с предупреждением компилятора о печати optional.