weak let: ссылка, которая всё равно обнулится 💣
🎯 SE-0481 разрешает комбинировать weak и let. Раньше слабая ссылка требовала var, даже если вы её никогда не переприсваиваете.
⚠️ Первое и главное: это Swift 6.3, а не 6.2. В 6.2 компилятор всё ещё выдаёт «'weak' must be a mutable variable, because it may change at runtime». Пропозал приняли в цикле 6.2, поэтому половина статей ставит его в 6.2 — но в релизной заметке swift.org про 6.2 его нет.
⚠️ Второе: let запрещает переприсваивание, но не мешает объекту умереть. Ссылка по-прежнему обнуляется при уничтожении референта, тип по-прежнему Optional, и каждое чтение по-прежнему требует разворачивания. Так что «безопаснее» — не про это. Настоящая мотивация была не в выразительности, а в конкурентности: Sendable-класс не мог держать weak var, потому что это изменяемое хранимое свойство, а захваты [weak self] неявно делались изменяемыми, из-за чего замыкание не могло быть @Sendable. Ограничения: тип обязан быть Optional, локальные переменные разрешены, в остальном обычные правила let.
#Swift #Swift6 #iOSDevelopment #MemoryManagement #SwiftConcurrency
· 06.08
до 6.3 в проде это обходили через nonisolated(unsafe) var в final-обёртке, чтобы @Sendable замыкания вообще компилились без предупреждений. при переходе на weak let важно не просто var→let заменить, а заодно снести эти обёртки и проверить, что optional binding не всплыл в новом месте на стыке акторов. иначе словишь compile error там, где раньше было тихое undefined behavior
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён