Будет напечатано 77: замыкание меняет свойство исходной переменной numberBox, а не отдельной копии структуры.
Какой будет выведен результат (вариант 2)
Будет напечатано 77: замыкание меняет свойство исходной переменной numberBox, а не отдельной копии структуры.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрите объявление структуры, инкапсулирующей целочисленное значение, и последовательность операций, в которой создаётся замыкание, изменяющее это значение. После вызова замыкания выведите текущую величину свойства.
struct IntegerBox {
var value: Int
init(_ value: Int) {
self.value = value
}
}
var numberBox = IntegerBox(10)
let modify = {
numberBox.value = 77
}
modify()
print(numberBox.value)
Ответ
Будет напечатано 77: замыкание меняет свойство исходной переменной numberBox, а не отдельной копии структуры.
Замыкание без capture list захватывает доступ к изменяемой переменной. Вызов modify присваивает 77 полю value этой переменной, и последующий print читает обновлённое значение. Хотя IntegerBox — struct, это не означает копирование снимка при каждом обращении из closure. Если бы значение было явно захвачено как [numberBox], оно стало бы отдельной константой захвата и такая запись в его поле напрямую не компилировалась бы.