Будет напечатано The result is 23: замыкание читает текущее значение calculator, а b к этому времени равно 20.
Какой текст появится в выводе программы
Будет напечатано The result is 23: замыкание читает текущее значение calculator, а b к этому времени равно 20.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере рассматривается структура Calculator, которая хранит два целочисленных свойства и предоставляет вычисляемое свойство sum — сумму этих полей. Затем создаётся экземпляр структуры, объявляется замыкание, которое выводит результат вычисления, после чего значение одного из полей изменяется и замыкание вызывается. Нужно определить, что будет напечатано в консоли.
struct Calculator {
var a: Int
var b: Int
var sum: Int {
return a + b
}
}
var calculator = Calculator(a: 3, b: 5)
let closure = {
print("The result is \(calculator.sum)")
}
calculator.b = 20
closure()
Ответ
Будет напечатано The result is 23: замыкание читает текущее значение calculator, а b к этому времени равно 20.
Без capture list замыкание обращается к изменяемой переменной, а не создаёт снимок структуры при объявлении. Вычисляемое свойство sum заново складывает 3 + 20 во время вызова. Для фиксации значения на момент создания можно написать let closure = { [calculator] in print(calculator.sum) }: тогда захваченное значение имело бы сумму 8. Тип-значение сам по себе не означает автоматический снимок при любом захвате переменной.