Ответ
Замыкание является сбегающим по семантике, но не требует аннотации @escaping, когда оно выполняется синхронно внутри вызываемой функции до её завершения. Компилятор Swift требует @escaping только если замыкание может быть вызвано после возврата из функции.
Пример без @escaping:
func performSync(closure: () -> Void) {
// Замыкание выполняется немедленно, до выхода из функции
closure()
}
performSync {
print("Выполнено синхронно")
}
Контраст с @escaping:
class Storage {
var savedClosure: (() -> Void)?
func storeForLater(closure: @escaping () -> Void) {
// Замыкание сохраняется и может быть вызвано позже
savedClosure = closure
}
}
Ключевое правило: @escaping требуется, когда замыкание:
- Сохраняется в свойство/переменную вне scope функции
- Передаётся в асинхронную операцию (DispatchQueue, URLSession)
- Возвращается как результат функции