Какой текст появится в выводе программы

Будет напечатано 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. Тип-значение сам по себе не означает автоматический снимок при любом захвате переменной.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее