Escaping и нез escaping-замыкания, автозамыкания
Разберитесь с нез escaping-замыканиями (по умолчанию) и @escaping (сохраняемыми или используемыми после возврата), а также используйте @autoclosure для более удобных вызовов с ленивым вычислением.
«Escaping и нез escaping-замыкания, автозамыкания» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Обзор
Цель: понимать, когда closure является не сохраняющимся по умолчанию, а когда — @escaping (сохраняется или выполняется асинхронно), и как @autoclosure делает места вызова более понятными.
Не сохраняется по умолчанию
Параметры closure по умолчанию не сохраняются — они вызываются до возврата из функции и никогда не хранятся.
// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
return f(f(x)) // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled) // 12Сохраняющийся closure
Помечайте параметр как @escaping, если сохраняете closure или выполняете его после возврата из функции, например для таймеров и асинхронной работы.
// Need @escaping when storing for later use:
var tasks: [() -> Void] = []
func addTask(_ work: @escaping () -> Void) {
tasks.append(work) // stored to run later
}
addTask { print("run later") }
tasks.forEach { $0() }Асинхронное завершение
Асинхронные программные интерфейсы обычно принимают обработчики завершения с атрибутом @escaping, которые вызываются после возврата из функции.
func fetchData(completion: @escaping (String) -> Void) {
// simulate async: call completion in the future
// (In real apps, use DispatchQueue or URLSession)
completion("done") // still escaping by contract (may be called later)
}
fetchData { result in print(result) }Автоматическое создание closure
@autoclosure позволяет передавать выражение вместо явного написания closure, что повышает удобство чтения.
// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
if condition() { print("Condition is true") }
}
let x = 3
logIf(x > 1) // no braces needed; expression is turned into a closureАвтоматическое создание и сохранение closure
@autoclosure @escaping сохраняет переданное выражение для последующей оценки — учитывайте захваченное состояние и время выполнения.
// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []
func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
checks.append(condition) // stored to run later
}
var threshold = 10
enqueueCheck(threshold > 5) // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() }) // re-evaluates with updated thresholdПравило сохранения closure
Быстрая проверка: когда требуется @escaping?
Итоги
Итоги: по умолчанию closure не сохраняются. Используйте @escaping, если closure сохраняется или вызывается позже. Применяйте @autoclosure для более понятных мест вызова и осторожно сочетайте его с @escaping.
Часто задаваемые вопросы
Урок «Escaping и нез escaping-замыкания, автозамыкания» бесплатный?
Да — полный текст урока «Escaping и нез escaping-замыкания, автозамыкания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Escaping и нез escaping-замыкания, автозамыкания»?
Разберитесь с нез escaping-замыканиями (по умолчанию) и @escaping (сохраняемыми или используемыми после возврата), а также используйте @autoclosure для более удобных вызовов с ленивым вычислением. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Escaping и нез escaping-замыкания, автозамыкания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы замыканий и захвата
- Списки захвата — weak/unowned и захват значений
- Escaping и нез escaping-замыкания, автозамыкания