Выбор ответа Senior Замыкания и захват обновлено
Неявный self в escaping-замыкании
Вопрос
Почему в escaping-замыкании внутри класса нужно писать self. явно, а внутри структуры (Swift 5.3+) нет?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Захват self класса продлевает жизнь объекта и может дать цикл. Требование явного self в escaping-замыкании класса это напоминание: вы захватываете сильную ссылку и можете получить цикл ссылок.
Варианты ответа
- Внутри структуры
selfвообще не захватывается escaping-замыканием - Явный
selfнужен только в классах, помеченных@MainActor - Это вопрос стиля: правило задаёт SwiftLint, а не компилятор
- Захват
selfкласса продлевает жизнь объекта и может дать циклправильный ответ
Разбор
Требование явного self в escaping-замыкании класса это напоминание: вы захватываете сильную ссылку и можете получить цикл ссылок. SE-0269 разрешил неявный self, если в списке захвата есть [self] или если self тип значения: копия структуры не создаёт циклов. При этом структура всё равно захватывается, просто как значение. Требование задаёт компилятор, а не линтер, и не зависит от акторов.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Замыкания и захват»
- Зачем нужен @autoclosure
- Захват переменной замыканием в Swift
- Список захвата замыкания
- Что значит @escaping
- Escaping-замыкание и mutating self
- Почему non-escaping замыкания дешевле
- Сокращённый синтаксис замыканий в Swift
- Задача на Swift: сортировка контактов по нескольким полям