Результат равен 6: замыкания увеличивают общий counter на 1, затем на 2 и на 3.
Какой результат появится в консоли (пример 3)
Результат равен 6: замыкания увеличивают общий counter на 1, затем на 2 и на 3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод будет получен в консоль и объясните, почему это происходит.
var counter = 0
let closures = [ { counter += 1 }, { counter += 2 }, { counter += 3 } ]
closures.forEach { $0() }
print(counter)
Ответ
Результат равен 6: замыкания увеличивают общий counter на 1, затем на 2 и на 3.
Все элементы массива обращаются к одной изменяемой переменной counter. forEach выполняет вызовы последовательно: значения становятся 1, 3, 6. Здесь нет ни асинхронного запуска, ни capture list, фиксирующего отдельные снимки. Поэтому утверждение, что каждое замыкание начинает с исходного нуля, неверно. При параллельном выполнении такой доступ уже потребовал бы синхронизации, но исходный код параллельным не является.