Выбор ответа Middle Замыкания и захват обновлено
Зачем нужен @autoclosure
Вопрос
Что делает @autoclosure у параметра message: @autoclosure () -> String?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Оборачивает выражение в замыкание, и оно вычисляется, только если его вызовут. Вызывающий пишет обычное выражение log(expensive()), а функция получает замыкание и решает, вычислять ли его.
Варианты ответа
- Оборачивает выражение в замыкание, и оно вычисляется, только если его вызовутправильный ответ
- Кеширует результат замыкания после первого вызова и дальше возвращает только его
- Делает замыкание
@escaping, чтобы его можно было сохранить в свойство - Вызывает замыкание сразу при передаче и подставляет в параметр результат
Разбор
Вызывающий пишет обычное выражение log(expensive()), а функция получает замыкание и решает, вычислять ли его. Так устроены assert, precondition и правая часть ?? и &&: дорогое выражение не считается, если не нужно. Кеширования нет, каждый вызов замыкания вычисляет выражение заново. Escaping нужно указывать отдельно: @autoclosure @escaping.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Замыкания и захват»
- Список захвата замыкания
- Что значит @escaping
- Escaping-замыкание и mutating self
- Почему non-escaping замыкания дешевле
- Сокращённый синтаксис замыканий в Swift
- Паттерн weak self в замыкании
- Неявный self в escaping-замыкании
- Задача на Swift: debounce для поиска