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

Опциональное замыкание-параметр и @escaping

Вопрос

Почему у параметра completion: (() -> Void)? нельзя написать @escaping?

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

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

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

Коротко

Правильный ответ: Опциональное замыкание уже неявно escaping: оно хранится внутри Optional. Атрибут @escaping применим только к параметру функционального типа.

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

  1. Опциональные замыкания всегда non-escaping, и атрибут им противоречит
  2. @escaping здесь пишется после ?: (() -> Void)? @escaping
  3. Опциональные замыкания в параметрах функций в Swift запрещены
  4. Опциональное замыкание уже неявно escaping: оно хранится внутри Optionalправильный ответ

Разбор

Атрибут @escaping применим только к параметру функционального типа. (() -> Void)? это Optional<() -> Void>, и замыкание внутри него считается escaping автоматически. Отсюда ловушка: опциональное замыкание всегда escaping, и при захвате self в классе требуется явный self. Такой синтаксис не запрещён, а @escaping после ? не пишется.

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

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