Когда использовать weak let, а когда weak var в Swift
Что проверяют
Понимаете ли вы, что weak описывает ссылку, а не объект, и что слабая ссылка обнуляется сама, когда объект освобождается. Следом почти всегда просят объяснить, зачем weak let вообще понадобился и как он связан с Sendable.
Как отвечать
Начните с базы. Слабая ссылка не увеличивает счётчик ARC, поэтому разрывает цикл удержания, а после освобождения объекта превращается в nil. Отсюда два следствия: тип всегда опциональный, и значение может поменяться без вашего участия. Поэтому долгое время компилятор разрешал только weak var, а на weak let отвечал ошибкой: слабая ссылка обязана быть изменяемой.
В свежих версиях Swift по предложению SE-0481 появился weak let для свойств. Разница такая:
weak var: ссылку можно переназначить. Классический случай этоweak var delegate: SomeDelegate?, где протокол ограниченAnyObject, а делегата заменяют или сбрасывают по ходу жизни объекта;weak let: ссылку задают один раз в инициализаторе и больше не меняют, но обнулиться при освобождении объекта она по-прежнему может;- ради чего это сделано: класс с
weak varсодержит изменяемое хранимое свойство и не может бытьSendableбез@unchecked. Сweak letфинальный класс проходит проверку, что важно в строгом режиме конкурентности Swift 6.
Стоит упомянуть, что список захвата [weak self] в замыкании и раньше работал как неизменяемая слабая ссылка: переменные из списка захвата константы. И назвать альтернативу: unowned не обнуляется и падает при обращении к освобождённому объекту, поэтому годится, только когда объект гарантированно живёт не меньше ссылки.
Где спотыкаются
Думают, что let делает неизменяемым сам объект. Нет, let запрещает переназначать ссылку, а свойства объекта меняются как угодно.
Считают, что weak let гарантирует наличие объекта. Он всё равно опциональный, и проверять nil через guard let нужно так же, как с weak var.
Показывают локальную слабую переменную рядом с сильной, как в старых шпаргалках. Такой пример ничего не демонстрирует: циклы удержания возникают между объектами и в замыканиях, и разбирать weak стоит на делегате или на [weak self].