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

Зачем нужен @autoclosure

Вопрос

Что делает @autoclosure у параметра message: @autoclosure () -> String?

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

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

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

Коротко

Правильный ответ: Оборачивает выражение в замыкание, и оно вычисляется, только если его вызовут. Вызывающий пишет обычное выражение log(expensive()), а функция получает замыкание и решает, вычислять ли его.

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

  1. Оборачивает выражение в замыкание, и оно вычисляется, только если его вызовутправильный ответ
  2. Кеширует результат замыкания после первого вызова и дальше возвращает только его
  3. Делает замыкание @escaping, чтобы его можно было сохранить в свойство
  4. Вызывает замыкание сразу при передаче и подставляет в параметр результат

Разбор

Вызывающий пишет обычное выражение log(expensive()), а функция получает замыкание и решает, вычислять ли его. Так устроены assert, precondition и правая часть ?? и &&: дорогое выражение не считается, если не нужно. Кеширования нет, каждый вызов замыкания вычисляет выражение заново. Escaping нужно указывать отдельно: @autoclosure @escaping.

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

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