Являются ли escaping closures в Swift ссылочными типами?

«Являются ли escaping closures в Swift ссылочными типами?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, escaping closures являются ссылочными типами (reference types). Swift автоматически управляет их памятью с помощью ARC (Automatic Reference Counting).

Причина: Поскольку escaping closure может пережить контекст, в котором он был создан (например, сохранён для последующего выполнения), он должен захватывать переменные из окружающей области видимости по ссылке, а не по значению.

Пример захвата по сильной ссылке:

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

    func fetchData(completion: @escaping () -> Void) {
        // Захватывает 'self' по сильной ссылке
        self.onDataUpdated = { [weak self] in
            guard let self = self else { return }
            print("Data updated for: (self)")
            completion()
        }
        // ... асинхронная операция, позже вызывается onDataUpdated
    }
}

Важно: Чтобы избежать циклов удержания (retain cycles), при захвате self или других ссылочных типов внутри escaping closure следует использовать списки захвата ([weak self], [unowned self]).