Когда замыкание в Swift считается escaping, даже если в коде не указано ключевое слово @escaping?

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

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

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

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

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

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

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

Однако есть случаи, когда замыкание считается escaping даже без явного @escaping:

  • Если замыкание используется как параметр функции, которая сама объявлена с @escaping для этого параметра.
  • При использовании замыканий в асинхронных операциях, например, в API, где замыкание сохраняется для вызова позже (например, в DispatchQueue или URLSession).

То есть, если замыкание передается дальше и вызывается после выхода из текущей функции, компилятор требует @escaping. Если @escaping не указан, но замыкание фактически сохраняется и вызывается позже, это приведет к ошибке компиляции.

Пример:

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

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

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

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

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

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

Подробнее