TGViewer
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck @mobileproglib · 9.17K subscribers
Post #7082 712
🎮 Асинхронная очистка с помощью defer в Swift

Оператор defer Swift полезен для логики очистки. Он гарантирует, что блок кода будет выполнен при выходе из текущей области видимости, независимо от того, завершится ли выполнение нормально, возникнет ли ошибка или произойдет досрочный возврат.

До выхода Swift 6.4 мы не могли выполнять асинхронные операции непосредственно внутри блока defer. Начиная с версии Swift 6.4 это стало возможным.

🔹 Ограничения defer без поддержки async

Рассмотрим функцию, которая открывает ресурс и должна закрыть его после завершения работы:

func processFile() async throws {
let file = try await openFile()

defer {
file.close()
}

try await process(file)
}


Это работает, только если очистка выполняется синхронно. Однако многие современные API являются асинхронными. Если для закрытия файла требуется await, приведенный выше код не сработает:

defer {
await file.close() // Ошибка компилятора в Swift версии < 6.4
}

Чтобы устранить ошибку компилятора, нам пришлось перенести логику очистки в другое место:

let file = try await openFile()

do {
try await process(file)
await file.close()
} catch {
await file.close()
throw error
}


Помимо дублирования кода, это делает логику очистки менее очевидной, поскольку она отделена от получения ресурса.

🔹 Асинхронная очистка с помощью defer

Благодаря поддержке асинхронных операций с помощью defer мы можем расположить получение и очистку ресурсов рядом друг с другом:

func processFile() async throws {
let file = try await openFile()

defer {
await file.close()
}

try await process(file)
}


Теперь операция очистки гарантированно выполняется при выходе из области видимости, но при этом поддерживается асинхронная работа.

🔹 Примечание по изоляции акторов|

Блок defer наследует изоляцию актора от охватывающей его области видимости. Если окружающая функция выполняется на @MainActor, код очистки внутри defer также выполняется на @MainActor.

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#АрхитектурныйКод #Swift
More from @mobileproglib
  1. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  2. Sep 15, 2026🖥 Наглядная шпаргалка по операторам Combine Внутри: описанием распространенных операторов…
  3. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 9, 2026🤳 Как работает мобильная разработка с AI под капотом — интенсивы от Podlodka Crew Конфере…
  6. Aug 8, 2026⚙️ Kinetics — настраиваемые примитивы физического движения для SwiftUI Kinetics привносит…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →