Выбор ответа Junior Замыкания и захват спрашивают часто обновлено

Захват переменной замыканием в Swift

Вопрос

Что выведет f()?

var x = 1
let f = { print(x) }
x = 2
f()

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

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

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

Коротко

Правильный ответ: 2: замыкание захватывает саму переменную, а не её значение. По умолчанию замыкание захватывает переменную по ссылке (через бокс), поэтому видит её последнее значение.

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

  1. 2: замыкание захватывает саму переменную, а не её значениеправильный ответ
  2. 1: значение копируется в замыкание в момент его создания
  3. Ошибка компиляции: замыкание не может захватывать var
  4. Ничего: замыкание создано, но вызов f() его не выполняет никак

Разбор

По умолчанию замыкание захватывает переменную по ссылке (через бокс), поэтому видит её последнее значение. Чтобы зафиксировать значение на момент создания, нужен список захвата: { [x] in print(x) }. Захват var разрешён, а f() как раз вызывает замыкание.

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

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