Является ли completion-блок полем класса с точки зрения escaping или non-escaping?

В контексте Swift и iOS development, completion-блок, если он является полем класса (то есть хранится в свойстве), считается escaping closure.

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

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

В контексте Swift и iOS development, completion-блок, если он является полем класса (то есть хранится в свойстве), считается escaping closure. Это связано с тем, что блок может быть вызван после выхода из функции, где он был передан, например, асинхронно.

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

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

В контексте Swift и iOS development, completion-блок, если он является полем класса (то есть хранится в свойстве), считается escaping closure. Это связано с тем, что блок может быть вызван после выхода из функции, где он был передан, например, асинхронно.

Если completion-блок передается в функцию и вызывается внутри неё синхронно, он non-escaping по умолчанию.

Пример:

class MyClass {
    var completion: (() -> Void)? // escaping closure, так как хранится в свойстве

    func doSomething() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.completion?() // вызов после задержки
        }
    }
}

Здесь completion — escaping, так как вызывается позже, вне контекста вызова функции.

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

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

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

Подробнее