Код не компилируется: firstInt в capture list — захваченная константа структуры, и её свойство нельзя изменить.
Какой вывод получим в этом примере №3
Код не компилируется: firstInt в capture list — захваченная константа структуры, и её свойство нельзя изменить.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В данном фрагменте кода демонстрируется, как замыкание захватывает объект структуры и пытается изменить его свойство. Нужно понять, какое значение будет напечатано после выполнения замыкания.
struct IntegerBox {
var value: Int
init(_ value: Int) {
self.value = value
}
}
var firstInt = IntegerBox(10)
let closure = { [firstInt] in
firstInt.value = 77
}
closure()
print(firstInt.value)
Ответ
Код не компилируется: firstInt в capture list — захваченная константа структуры, и её свойство нельзя изменить.
[firstInt] фиксирует отдельное значение на момент создания closure. Попытка присвоить firstInt.value = 77 нарушает неизменяемость этого захвата, поэтому до print программа не дойдёт. Если убрать capture list, closure сможет изменить исходную var-переменную и результат станет 77. Если внутри создать var copy = firstInt и менять copy, исходное значение останется 10. Это разные требуемые семантики, а не взаимозаменяемые исправления.