Какой вывод получит программа

Будет напечатано 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее