Чем словарь отличается от массива в контексте сохранения порядка и индексации в Swift
Что проверяют
Понимаете ли вы разницу между упорядоченной коллекцией с целочисленным индексом и хеш-таблицей, и знаете ли, что порядок перебора словаря в Swift не определён. Второе почти всегда и есть цель вопроса.
Как отвечать
Array хранит элементы подряд в буфере. Индекс это позиция, порядок ровно тот, в котором вы клали элементы, дубликаты разрешены. Доступ по индексу за константное время, добавление в конец в среднем тоже, а вставка и удаление в середине линейные, потому что хвост сдвигается.
Dictionary это хеш-таблица. Ключ обязан быть Hashable, ключи уникальны, поиск, вставка и удаление в среднем за константу. Порядка у словаря нет: перебор идёт по расположению в таблице, а Swift подмешивает к хешу случайное зерно при каждом запуске программы, поэтому один и тот же словарь на двух запусках даст разные последовательности. Индекс у словаря существует, но это позиция во внутреннем хранилище, и она портится при любом изменении.
Стоит добавить две вещи, которые ждут следом. Обращение dict[key] возвращает опционал, а array[i] падает при выходе за границы, поэтому безопасный доступ делают через indices.contains или first(where:). И обе коллекции это значимые типы с копированием при записи: присваивание не копирует буфер, пока в него не пишут.
Если нужен и порядок, и быстрый поиск, держат две структуры рядом:
var byID = [Int: User]()
var order = [Int]()Где спотыкаются
Утверждают, что словарь сохраняет порядок добавления. Не сохраняет. На этом ломаются списки, собранные перебором словаря, и снимки экрана в тестах, причём дефект плавающий: на симуляторе повезло, у пользователя нет.
Второе: сортируют словарь и ждут, что он останется словарём. Метод sorted(by:) возвращает массив пар, и класть результат обратно в словарь бессмысленно, порядок снова потеряется.
Третье: делают ключом свой тип с несогласованными == и hash. Два равных объекта с разными хешами попадут в разные корзины, и значение по ключу просто не найдётся, хотя визуально ключ тот же.