Выбор ответа Senior Замыкания и захват обновлено
Цикл через lazy-свойство с замыканием
Вопрос
Есть ли цикл ссылок: lazy var greet: () -> String = { "Привет, " + self.name } в классе?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Да: объект держит замыкание, оно сильно держит self. Lazy-свойство инициализируется при первом обращении, и в этот момент self уже доступен.
Варианты ответа
- Нет: lazy-свойства всегда захватывают
selfслабо - Нет:
selfнельзя использовать в lazy-свойстве - Цикл есть, только если свойство ни разу не было прочитано
- Да: объект держит замыкание, оно сильно держит
selfправильный ответ
Разбор
Lazy-свойство инициализируется при первом обращении, и в этот момент self уже доступен. Замыкание сохраняется в свойство объекта и сильно держит self, получается цикл. Здесь уместен [unowned self]: замыкание живёт внутри объекта и не может пережить его (если его не отдают наружу). Пока свойство не прочитано, замыкание не создано, и цикла как раз нет. В отличие от этого, lazy var x = self.name.count (не замыкание) цикла не создаёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.