Порядок выполнения нескольких блоков 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 — локальная установка не требуется.
Все уроки этого курса
- Как работает defer
- Порядок выполнения нескольких блоков defer
- defer для освобождения ресурсов
- defer с ошибками и ранним возвратом