Выбор ответа Senior Замыкания и захват обновлено

Неявный self в escaping-замыкании

Вопрос

Почему в escaping-замыкании внутри класса нужно писать self. явно, а внутри структуры (Swift 5.3+) нет?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Захват self класса продлевает жизнь объекта и может дать цикл. Требование явного self в escaping-замыкании класса это напоминание: вы захватываете сильную ссылку и можете получить цикл ссылок.

Варианты ответа

  1. Внутри структуры self вообще не захватывается escaping-замыканием
  2. Явный self нужен только в классах, помеченных @MainActor
  3. Это вопрос стиля: правило задаёт SwiftLint, а не компилятор
  4. Захват self класса продлевает жизнь объекта и может дать циклправильный ответ

Разбор

Требование явного self в escaping-замыкании класса это напоминание: вы захватываете сильную ссылку и можете получить цикл ссылок. SE-0269 разрешил неявный self, если в списке захвата есть [self] или если self тип значения: копия структуры не создаёт циклов. При этом структура всё равно захватывается, просто как значение. Требование задаёт компилятор, а не линтер, и не зависит от акторов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.