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

Ответ

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

Ответ 18+ 🔞

Ну, слушай, смотри, вот эта вся тема с Async/await в Swift 5.5 — это, блядь, просто праздник какой-то для задрота, который устал от этих пиздецовых лестниц из колбэков до самого ада.

Чем это, сука, хорошо:

  • Читается как книга, блядь. Ты смотришь на код, и он идёт строчка за строчкой, а не прыгает по замыканиям, как угорелый. Ад колбэков, блядь, накрылся медным тазом.
  • Ошибки ловить — одно удовольствие. Вместо того чтобы в каждом completion'е Result разбирать, просто try/catch обернул и всё, ёпта. Чисто, аккуратно.
  • Система типов не обосрётся. Функция помечена async — сразу видно, что она будет тебя ждать. Вызов помечен await — сразу понятно, где можно подвиснуть. Красота, блядь.
  • Конкурентность прям в комплекте. Task, Actor — всё это теперь родное, структурированное, а не самопальное через DispatchQueue.
  • Быстрее, сука. Никаких лишних замыканий-продолжений не создаётся, всё оптимизировано.

Но, конечно, без ложки дёгтя, блядь, никуда:

  • Требует iOS 15+, ёпта. Если ты поддерживаешь старьё, типа iOS 13, то можешь идти нахуй со своими красивыми async-функциями. Или оборачивать это всё в костыли.
  • Отладка, блядь, иногда — пиздец. Стек вызовов асинхронный, и когда всё повисло, разбираться, кто кого ждал, — то ещё удовольствие. Волнение ебать.
  • Память может потечь, как решето. Забыл в Task слабую ссылку на self — и всё, привет, retain cycle, пидарас шерстяной. Сам от себя охуеешь, когда утечку найдешь.
  • С Objective-C не дружит. Хочешь из старого кода позвать — нихуя. Экспортироваться туда эта магия не хочет.
  • Не везде воткнуть можно. В свойства или в инициализатор просто так не запихнёшь, только внутри функций.

Смотри, как это выглядит, блядь:

// Объявляешь функцию — раз, и async к ней прилепил.
func fetchUserData(from url: URL) async throws -> User {
    // Ждёшь данные с сервака. Просто await, и всё.
    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)")
    }
}

Вот и вся магия. С одной стороны — красота, читаемость, скорость. С другой — подводные ебучки с версиями и отладкой. Но в целом, блядь, шаг вперёд, овердохуищный.