Каковы преимущества и недостатки async/await в Swift?

«Каковы преимущества и недостатки async/await в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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)")
    }
}