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

Цикл через lazy-свойство с замыканием

Вопрос

Есть ли цикл ссылок: lazy var greet: () -> String = { "Привет, " + self.name } в классе?

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

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

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

Коротко

Правильный ответ: Да: объект держит замыкание, оно сильно держит self. Lazy-свойство инициализируется при первом обращении, и в этот момент self уже доступен.

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

  1. Нет: lazy-свойства всегда захватывают self слабо
  2. Нет: self нельзя использовать в lazy-свойстве
  3. Цикл есть, только если свойство ни разу не было прочитано
  4. Да: объект держит замыкание, оно сильно держит selfправильный ответ

Разбор

Lazy-свойство инициализируется при первом обращении, и в этот момент self уже доступен. Замыкание сохраняется в свойство объекта и сильно держит self, получается цикл. Здесь уместен [unowned self]: замыкание живёт внутри объекта и не может пережить его (если его не отдают наружу). Пока свойство не прочитано, замыкание не создано, и цикла как раз нет. В отличие от этого, lazy var x = self.name.count (не замыкание) цикла не создаёт.

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

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