Является ли порядок вывода гарантированным или вероятным
Что проверяют
Различаете ли вы гарантии контракта и наблюдаемое поведение. Вопрос обычно идёт после задачки с несколькими выводами в консоль из разных очередей: интервьюер хочет услышать не «будет вот так», а «вот что гарантировано, а вот что просто чаще случается».
Как отвечать
Разделите три случая.
Последовательная очередь, включая главную, даёт гарантию: задачи выполняются по одной в порядке постановки, вывод предсказуем.
Конкурентная и глобальные очереди гарантируют только порядок старта, но не завершения. Задачи идут параллельно, вывод перемешивается, и стабильный результат на симуляторе ничего не доказывает: он меняется от числа ядер и от загрузки устройства.
В Swift Concurrency гарантий ещё меньше. Порядок выполнения независимых Task не определён. Актор защищает своё состояние, но реентерабелен: на каждом await внутрь может зайти другая задача, и код после ожидания видит уже изменённое состояние. Результаты TaskGroup приходят в порядке завершения, поэтому для восстановления исходного порядка их собирают в словарь по индексу.
Нужен порядок при параллельном выполнении, значит его задают явно: зависимостями в OperationQueue, барьером на конкурентной очереди, цепочкой await или последовательным прогоном.
Отдельно про коллекции: у массива порядок гарантирован, у Dictionary и Set не определён и меняется между запусками приложения, потому что хеширование инициализируется случайным зерном на процесс.
Где спотыкаются
Считают воспроизводимый вывод гарантией. Порядок, стабильный на симуляторе, на устройстве под нагрузкой ломается, и такие баги ловят не отладчиком, а жалобами пользователей.
Обрабатывают ответы сети в порядке отправки запросов. При быстром наборе в поиске поздний ответ на старый запрос перезаписывает свежие данные, поэтому ответ либо сопровождают идентификатором запроса, либо отменяют устаревшую задачу.
Думают, что DispatchGroup упорядочивает работу. Он лишь сообщает, что всё завершилось, а в каком порядке это произошло, не знает никто.