MiddleДебаггингЧастоЕщё не отвечали
struct, захваченный в замыкании, показывает старое значение после изменения внешней переменной — объясните и исправьте
Замыкание ниже печатает 0, а не 10, хотя counter изменили до вызова. Объясните почему и исправьте так, чтобы печаталось последнее значение.
struct Counter { var value = 0 }
var counter = Counter()
let printLater = { [counter] in print(counter.value) }
counter.value = 10
printLater() // печатает 0
Найдите и исправьте ошибку.
Список захвата [value] копирует значимое значение в момент создания замыкания — это снимок, поэтому поздние мутации внешней переменной не видны. Уберите список захвата, чтобы захватывать саму переменную, или перейдите на class, чтобы разделять состояние.
- ✗Думают, что список захвата читает переменную вживую, а не снимает снимок
- ✗Винят многопоточность вместо семантики захвата копированием значения
- ✗Полагают, что
@escapingменяет то, что захватывает список захвата
- →Чем захват без списка отличается от списка
[counter]? - →Когда снимок через список захвата — это именно нужное поведение?
Список захвата [counter] копирует значимое значение в момент создания замыкания — это снимок. Последующая counter.value = 10 меняет внешнюю переменную, а не копию внутри замыкания. Уберите список захвата, чтобы замыкание захватывало саму переменную:
let printLater = { print(counter.value) } // захват переменной, не копии
counter.value = 10
printLater() // 10
Если нужна общая изменяемая ссылка, сделайте Counter классом (class).