0Pricing
Swift Academy · Урок

Порядок выполнения нескольких блоков defer

Изучите обратный порядок выполнения defer.

«Порядок выполнения нескольких блоков defer» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Несколько блоков defer

Область видимости может содержать несколько блоков defer. Все они выполняются при выходе из области видимости.

func demo() {
    defer { print("A") }
    defer { print("B") }
    print("body")
}
demo()

Обратный порядок (LIFO)

Отложенные блоки выполняются в обратном порядке объявления: последний объявленный выполняется первым.

func order() {
    defer { print("1") }
    defer { print("2") }
    defer { print("3") }
    print("start")
}
order()

Зачем нужен LIFO

Порядок LIFO отражает вложенность настройки и освобождения: последняя выполненная настройка отменяется первой.

func resources() {
    print("open A")
    defer { print("close A") }
    print("open B")
    defer { print("close B") }
    print("use both")
}
resources()

Модель стека

Представляйте defers как стек: каждый из них помещает задачу в стек, а при завершении области видимости задачи извлекаются в обратном порядке.

func stack() {
    defer { print("pop first-declared last") }
    defer { print("pop last-declared first") }
    print("push done")
}
stack()

Defers и локальное состояние

Каждый defer захватывает окружающие переменные и видит их конечные значения в момент выполнения.

func state() {
    var x = 1
    defer { print("x is", x) }
    x = 42
}
state()

Defers в цикле

Внутри цикла каждая итерация регистрирует и выполняет собственные defers в порядке LIFO в конце этой итерации.

for i in 1...2 {
    defer { print("late", i) }
    defer { print("early", i) }
    print("body", i)
}

Вложенные области видимости

Defers выполняются при выходе из собственной области видимости, поэтому defer внутреннего блока выполняется раньше defer внешнего блока.

func nested() {
    defer { print("outer defer") }
    do {
        defer { print("inner defer") }
        print("inner body")
    }
    print("outer body")
}
nested()

Предсказуемая очистка

Порядок LIFO означает, что соответствующие пары открытия и закрытия естественным образом закрываются в правильной последовательности.

func files() {
    print("open log")
    defer { print("flush log") }
    print("open db")
    defer { print("disconnect db") }
    print("transaction")
}
files()

Как прочитать порядок

Чтобы предсказать вывод, читайте defers снизу вверх: последний defer в области видимости выводит результат первым.

func quiz() {
    defer { print("one") }
    defer { print("two") }
    print("body runs first")
}
quiz()

Сочетание с возвратом

Все зарегистрированные defers по-прежнему выполняются в порядке LIFO, даже если функция возвращает управление досрочно.

func early(_ skip: Bool) {
    defer { print("cleanup 1") }
    defer { print("cleanup 2") }
    if skip { return }
    print("full body")
}
early(true)

Рекомендуемый подход

Объявляйте каждое освобождение сразу после соответствующей настройки и полагайтесь на порядок LIFO, который корректно отменит их в обратной последовательности.

func pattern() {
    print("acquire 1")
    defer { print("release 1") }
    print("acquire 2")
    defer { print("release 2") }
    print("work")
}
pattern()

Быстрая проверка

Проверьте порядок выполнения defer.

Итоги

Несколько блоков defer выполняются в обратном порядке (LIFO) при выходе из области видимости: последний объявленный выполняется первым. Это естественным образом отменяет вложенные пары настройки и освобождения в правильном порядке, даже при досрочном возврате.

func demo() {
    defer { print("1") }
    defer { print("2") }
    print("body")
}
demo()

Часто задаваемые вопросы

Урок «Порядок выполнения нескольких блоков defer» бесплатный?

Да — полный текст урока «Порядок выполнения нескольких блоков defer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Порядок выполнения нескольких блоков defer»?

Изучите обратный порядок выполнения defer. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Порядок выполнения нескольких блоков defer»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Как работает defer
  2. Порядок выполнения нескольких блоков defer
  3. defer для освобождения ресурсов
  4. defer с ошибками и ранним возвратом
← Назад к Swift Academy