0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы замыканий и захвата
  2. Списки захвата — weak/unowned и захват значений
  3. Escaping и нез escaping-замыкания, автозамыкания
← Назад к Swift Academy