Выбор ответа Junior Замыкания и захват спрашивают часто обновлено
Захват переменной замыканием в Swift
Вопрос
Что выведет f()?
var x = 1
let f = { print(x) }
x = 2
f()
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: 2: замыкание захватывает саму переменную, а не её значение. По умолчанию замыкание захватывает переменную по ссылке (через бокс), поэтому видит её последнее значение.
Варианты ответа
2: замыкание захватывает саму переменную, а не её значениеправильный ответ1: значение копируется в замыкание в момент его создания- Ошибка компиляции: замыкание не может захватывать
var - Ничего: замыкание создано, но вызов
f()его не выполняет никак
Разбор
По умолчанию замыкание захватывает переменную по ссылке (через бокс), поэтому видит её последнее значение. Чтобы зафиксировать значение на момент создания, нужен список захвата: { [x] in print(x) }. Захват var разрешён, а f() как раз вызывает замыкание.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Замыкания и захват»
- Что значит @escaping
- Escaping-замыкание и mutating self
- Почему non-escaping замыкания дешевле
- Сокращённый синтаксис замыканий в Swift
- Паттерн weak self в замыкании
- Неявный self в escaping-замыкании
- Задача на Swift: debounce для поиска
- Задача на Swift: сортировка контактов по нескольким полям