Что такое Set, его особенности, зачем нужен и какие есть реализации
Что проверяют
Знаете ли вы, чем хеш-коллекция отличается от массива, и понимаете ли контракт хеширования. Вопрос дежурный, но по ответу видно, читали ли вы стандартную библиотеку или используете Array вообще везде.
Как отвечать
Set это неупорядоченная коллекция уникальных значений поверх хеш-таблицы. Тип элемента обязан быть Hashable. Проверка наличия, вставка и удаление в среднем за постоянное время против линейного перебора у массива, зато порядка нет и индексов тоже.
Что стоит назвать:
- операции над множествами:
union,intersection,subtracting,symmetricDifference,isSubset(of:). Ими удобно считать разницу состояний, например какие идентификаторы появились, а какие исчезли; - значимый тип с копированием при записи: присваивание не копирует хранилище, пока в него не пишут;
- соответствие
Hashableсинтезируется компилятором, если все хранимые свойства хешируемы; вручную реализуютhash(into:)и==вместе, по одним и тем же полям; - родня из Foundation:
NSSetиNSMutableSet,NSCountedSetдля подсчёта повторов, и упорядоченное множество из пакета коллекций, когда нужны и уникальность, и порядок.
Где спотыкаются
Считают, что порядок хоть и не определён, но стабилен, и завязывают на него интерфейс. Порядок обхода зависит от затравки хеширования и отличается между запусками приложения. Для показа список сортируют явно.
Кладут в множество объект класса и меняют поле, участвующее в хеше. Элемент остаётся лежать по старому месту: проверка наличия отвечает нет, удаление не срабатывает, а на глаз объект в коллекции есть. В хеш берут только неизменяемую часть.
Реализуют равенство и забывают хеш или считают его по другим полям. Контракт односторонний: равные значения обязаны давать равный хеш. Нарушили и получили дубликаты в коллекции, которая по определению их не допускает.