0
0
iOS Swiftmobile~20 mins

Async functions in iOS Swift - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Async Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
ui_behavior
intermediate
2:00remaining
What will this SwiftUI view display after 2 seconds?

Consider this SwiftUI view using an async function to fetch data:

struct ContentView: View {
  @State private var message = "Loading..."

  var body: some View {
    Text(message)
      .task {
        message = await fetchMessage()
      }
  }

  func fetchMessage() async -> String {
    try? await Task.sleep(nanoseconds: 2_000_000_000)
    return "Hello, async!"
  }
}

What text will be shown on screen after 2 seconds?

iOS Swift
struct ContentView: View {
  @State private var message = "Loading..."

  var body: some View {
    Text(message)
      .task {
        message = await fetchMessage()
      }
  }

  func fetchMessage() async -> String {
    try? await Task.sleep(nanoseconds: 2_000_000_000)
    return "Hello, async!"
  }
}
AThe app crashes due to missing await
B"Hello, async!" replaces "Loading..." after 2 seconds
C"Loading..." remains forever
D"Loading..." changes to empty string after 2 seconds
Attempts:
2 left
💡 Hint

Think about what the .task modifier does and how await pauses the function.

lifecycle
intermediate
2:00remaining
What happens if you call an async function without await in Swift?

Given this code snippet:

func loadData() async {
  print("Start loading")
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  print("Finished loading")
}

func example() {
  loadData()
  print("After loadData call")
}

What is the order of printed lines when example() is called?

iOS Swift
func loadData() async {
  print("Start loading")
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  print("Finished loading")
}

func example() {
  loadData()
  print("After loadData call")
}
AStart loading\nFinished loading\nAfter loadData call
BCompilation error: missing await
CStart loading\nAfter loadData call\nFinished loading
DAfter loadData call\nStart loading\nFinished loading
Attempts:
2 left
💡 Hint

Remember that calling an async function without await starts it but does not wait for it to finish.

📝 Syntax
advanced
2:00remaining
Which option correctly defines an async function that returns an Int after delay?

Choose the correct Swift function definition that waits 1 second and returns 42 asynchronously.

A
func getNumber() async -> Int {
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  return 42
}
B
async func getNumber() -> Int {
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  return 42
}
C
func getNumber() -> async Int {
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  return 42
}
D
func async getNumber() -> Int {
  try? await Task.sleep(nanoseconds: 1_000_000_000)
  return 42
}
Attempts:
2 left
💡 Hint

In Swift, the async keyword goes after the function parentheses.

🔧 Debug
advanced
2:00remaining
Why does this async function cause a runtime error?

Analyze this code snippet:

func fetchData() async -> String {
  DispatchQueue.global().async {
    print("Fetching data")
  }
  return "Done"
}

When calling await fetchData(), why might this cause unexpected behavior?

iOS Swift
func fetchData() async -> String {
  DispatchQueue.global().async {
    print("Fetching data")
  }
  return "Done"
}
AThe function causes a compile-time error because DispatchQueue cannot be used in async functions
BThe function throws a runtime exception due to missing await
CThe function blocks the main thread indefinitely
DThe function returns immediately before the async block finishes, causing race conditions
Attempts:
2 left
💡 Hint

Think about how DispatchQueue.global().async works compared to Swift concurrency.

🧠 Conceptual
expert
2:00remaining
What is the main advantage of Swift async/await over completion handlers?

Choose the best explanation for why Swift introduced async/await instead of using completion handlers for asynchronous code.

AAsync/await makes asynchronous code look and behave like synchronous code, improving readability and reducing callback nesting
BAsync/await runs all code on the main thread, improving UI responsiveness
CAsync/await eliminates the need for error handling in asynchronous code
DAsync/await automatically parallelizes all asynchronous tasks without developer control
Attempts:
2 left
💡 Hint

Think about how code looks and feels when using async/await compared to nested callbacks.