Отличается ли поведение опциональных замыканий в отношении их выхода за границы функции, то есть escaping или non-escaping?

В Swift замыкания по умолчанию являются non-escaping, то есть они не могут выйти за пределы функции, в которую передаются.

Короткий ответ

Что ответить на собеседовании

В Swift замыкания по умолчанию являются non-escaping, то есть они не могут выйти за пределы функции, в которую передаются. Если замыкание может быть вызвано после завершения функции (например, асинхронно), его нужно явно пометить как @escaping.

Подробный разбор

Ответ с пояснениями

В Swift замыкания по умолчанию являются non-escaping, то есть они не могут выйти за пределы функции, в которую передаются. Если замыкание может быть вызвано после завершения функции (например, асинхронно), его нужно явно пометить как @escaping.

Опциональные замыкания сами по себе не меняют это поведение. То есть опциональное замыкание может быть как non-escaping, так и escaping, в зависимости от объявления. Например:

func perform(action: (() -> Void)?) { // non-escaping optional closure
    action?()
}

func performAsync(action: (() -> Void)? ) @escaping { // escaping optional closure
    DispatchQueue.global().async {
        action?()
    }
}

Таким образом, опциональность не влияет на escaping/non-escaping — это разные характеристики. Нужно смотреть на объявление функции и использовать @escaping, если замыкание может быть вызвано позже.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее