📖 Scenario: Imagine you are building a simple app that fetches user data asynchronously. You want to practice how to use @escaping closures in Swift to handle the data after the fetch completes.
🎯 Goal: Build a Swift program that defines a function with an @escaping closure parameter, simulates an asynchronous fetch, and then calls the closure with the fetched data.
📋 What You'll Learn
Create a function called fetchUserData that takes an @escaping closure parameter named completion.
The completion closure should accept a String parameter representing user data.
Inside fetchUserData, simulate a delay using DispatchQueue.main.asyncAfter to mimic asynchronous fetching.
Call the completion closure inside the async block with the string "User data loaded".
Call fetchUserData and print the result inside the closure.
💡 Why This Matters
🌍 Real World
Escaping closures are used in real apps to handle asynchronous tasks like network requests, animations, or user interactions that complete later.
💼 Career
Understanding @escaping closures is essential for Swift developers working on iOS apps that fetch data from servers or perform delayed actions.
Progress0 / 4 steps
1
Create the fetchUserData function with an @escaping closure parameter
Write a function called fetchUserData that takes one parameter named completion. This parameter should be a closure marked with @escaping that accepts a String and returns Void. Inside the function, leave the body empty for now.
Swift
Hint
Remember to mark the closure parameter with @escaping because it will be called after the function returns.
2
Add asynchronous simulation inside fetchUserData
Inside the fetchUserData function, use DispatchQueue.main.asyncAfter with a delay of 1 second to simulate asynchronous work. Inside the async block, call the completion closure with the string "User data loaded".
Swift
Hint
Use DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) to delay the closure call by 1 second.
3
Call fetchUserData and handle the result
After the fetchUserData function, write a call to fetchUserData passing a closure that takes one parameter named data of type String. Inside the closure, print the data.
Swift
Hint
Call fetchUserData and provide a closure that prints the received data.
4
Run the program and see the output
Run the program to see the printed output from the closure after the simulated delay.
Swift
Hint
Wait one second after running to see the output printed.
Practice
(1/5)
1. What does the @escaping keyword indicate in Swift closures?
easy
A. The closure can be called after the function returns
B. The closure is executed immediately within the function
C. The closure cannot capture variables from the surrounding scope
D. The closure is only used for synchronous tasks
Solution
Step 1: Understand closure execution timing
Closures without @escaping run inside the function before it returns.
Step 2: Role of @escaping
Marking a closure @escaping means it can be stored and called later, after the function ends.
Final Answer:
The closure can be called after the function returns -> Option A
Quick Check:
@escaping means delayed closure call [OK]
Hint: Escaping closures run later, not immediately [OK]
The closure is called asynchronously after the function returns, so it must be marked @escaping.
Step 2: Check function parameter declaration
The parameter lacks @escaping, causing a compile error.
Final Answer:
Missing @escaping before closure parameter -> Option A
Quick Check:
Async closure needs @escaping [OK]
Hint: Async closure parameters must be @escaping [OK]
Common Mistakes:
Forgetting @escaping for async closures
Assuming closure is synchronous by default
Adding unnecessary optional to closure
5. You want to store a closure to call later after a network request finishes. Which is the correct way to declare and use this escaping closure in Swift?