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

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

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

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

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

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

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

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

Если замыкание нужно сохранить и вызвать позже (например, в асинхронном вызове, колбэке), то его необходимо пометить как @escaping.

Пример:

func performAsyncTask(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // какая-то работа
        completion() // вызываем замыкание позже
    }
}

Если замыкание используется только внутри функции и не сохраняется, @escaping не нужен.

Таким образом, механизм escaping требуется использовать только тогда, когда замыкание может быть вызвано после выхода из функции, в которую оно передано.

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

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

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

Подробнее