Выбор ответа Senior Коллекции и строки обновлено

Изменение ключа после вставки в Set

Вопрос

Класс Tag реализует Hashable по изменяемому полю name. Объект положили в Set, затем поменяли name. Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Множество будет некорректным: contains может не найти объект. Хеш вычисляется при вставке, и объект лежит в корзине старого хеша.

Варианты ответа

  1. Set заметит изменение через didSet и автоматически перехеширует объект
  2. Компилятор запретит менять поле объекта, пока тот лежит во множестве
  3. Объект автоматически удалится из множества при смене хеша
  4. Множество будет некорректным: contains может не найти объектправильный ответ

Разбор

Хеш вычисляется при вставке, и объект лежит в корзине старого хеша. После смены name поиск идёт по новому хешу в другую корзину и не находит объект, хотя он внутри. Для структур такая ситуация невозможна: элемент множества это копия. Для классов хешировать нужно только неизменяемые поля (например, id в let). Ни перехеширования, ни удаления, ни ошибки компиляции не будет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.