Swift Async-Await with Example

Asynchronous programming in Swift has been revolutionized with the introduction of the async and await keywords. These additions simplify the creation of asynchronous tasks, making code cleaner and more readable. In this article, we’ll explore async/await in Swift and provide code examples to help you understand this powerful feature.

What is Async/Await in Swift?

Async/await is a modern approach to handle asynchronous operations in Swift. It allows you to write asynchronous code in a more synchronous and structured way. This means no more callback hell and complex state management when dealing with asynchronous tasks.

With async/await, you can define functions that are marked as asynchronous using the async keyword. These functions can pause their execution at an await keyword and return control to the calling code until the awaited task is completed. This makes your code more linear and easier to follow.

Defining an Async Function

To define an asynchronous function in Swift, use the async keyword before the function declaration. Here’s an example of a simple async function that fetches data from a remote server:

func fetchUserData() async throws -> UserData {
    let url = URL(string: "https://example.com/api/user")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(UserData.self, from: data)

In this function, fetchUserData is marked as asynchronous with the async keyword. It fetches user data from a URL and returns it after decoding it from JSON. The await keyword is used with the URLSession call to wait for the data to be fetched.

Calling an Async Function

Calling an async function is straightforward. You use await when calling the function, indicating that the function’s result should be awaited. Here’s how you call the fetchUserData function:

do {
    let userData = try await fetchUserData()
    // Use userData in your app
} catch {
    // Handle errors

The try await syntax is used to call the asynchronous function and to handle any potential errors.

Benefits of Async/Await

  • Cleaner Code: Async/await promotes clean and readable code by eliminating callback nesting.
  • Improved Error Handling: Swift’s error handling mechanisms work seamlessly with async/await, making it easier to handle errors in asynchronous code.
  • Structured Concurrency: Swift’s structured concurrency model ensures that all tasks are properly managed and completed, preventing resource leaks.
  • Better Debugging: Debugging asynchronous code is more straightforward, as async/await retains the call stack, making it easier to track issues.


Async/await in Swift is a game-changer for asynchronous programming. It simplifies the creation of asynchronous tasks, resulting in cleaner and more maintainable code. By using the async and await keywords, you can write code that reads like a synchronous script, making it easier to develop and maintain.

With the code examples and explanations provided in this article, you have a solid foundation for incorporating async/await into your Swift projects. Embrace this modern approach to asynchronous programming and elevate your app development to a new level of simplicity and efficiency. Hope this helps!!!

A pat on the back !!