Ответ
Async/await — это модель асинхронного программирования, представленная в Swift 5.5.
Преимущества:
- Линейная читаемость: Код выглядит как синхронный, устраняя "ад колбэков" (callback hell).
- Упрощенная обработка ошибок: Использование
try/catchвместо completion-хендлеров сResult. - Интеграция с системой типов: Функции явно помечаются
async, а вызовы —await. - Поддержка конкурентности: Прямая работа с
Task,Actorи structured concurrency. - Производительность: Отсутствие накладных расходов на замыкания (closures) для продолжений (continuations).
Недостатки и ограничения:
- Требует iOS 15+ / macOS 12+ для полной поддержки на всех платформах Apple.
- Сложность отладки: Асинхронный стек вызовов может быть сложнее для анализа.
- Риск утечек памяти: Неявное захватывание self в
Taskбез weak-ссылок. - Ограниченная совместимость с Objective-C:
async-методы не экспортируются в ObjC. - Нельзя использовать в свойствах или инициализаторах: Только внутри функций и методов.
Пример:
// Объявление async функции
func fetchUserData(from url: URL) async throws -> User {
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
// Вызов в Task
Task {
do {
let user = try await fetchUserData(from: someURL)
await MainActor.run { self.updateUI(with: user) }
} catch {
print("Ошибка загрузки: (error)")
}
}