0
0
Swiftprogramming~20 mins

Task groups for parallel execution in Swift - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Swift Task Group Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of concurrent task group with async sleeps
What is the output of this Swift code using task groups for parallel execution?
Swift
import Foundation

func testTaskGroup() async {
    await withThrowingTaskGroup(of: String.self) { group in
        group.addTask {
            try await Task.sleep(nanoseconds: 1_000_000_000)
            return "First"
        }
        group.addTask {
            try await Task.sleep(nanoseconds: 500_000_000)
            return "Second"
        }
        group.addTask {
            return "Third"
        }

        for try await result in group {
            print(result)
        }
    }}

Task {
    await testTaskGroup()
}
RunLoop.main.run()
A
Third
First
Second
B
First
Second
Third
C
Second
Third
First
D
Third
Second
First
Attempts:
2 left
💡 Hint
Remember that tasks in a task group complete independently and results are received as they finish.
🧠 Conceptual
intermediate
1:30remaining
Understanding task group cancellation behavior
In Swift concurrency, what happens to remaining tasks in a task group if one task throws an error?
AOnly the task that threw the error is cancelled; others continue.
BAll remaining tasks are immediately cancelled and the error is propagated.
CThe task group waits for all tasks to finish before propagating the error.
DRemaining tasks continue running and the error is ignored.
Attempts:
2 left
💡 Hint
Think about how Swift handles errors in concurrent task groups to avoid wasted work.
🔧 Debug
advanced
2:00remaining
Identify the error in this task group code
What error does this Swift code produce?
Swift
import Foundation

func runTasks() async throws {
    await withThrowingTaskGroup(of: Int.self) { group in
        for i in 1...3 {
            group.addTask {
                if i == 2 {
                    throw NSError(domain: "Test", code: 1)
                }
                return i
            }
        }

        for try await value in group {
            print(value)
        }
    }}

Task {
    do {
        try await runTasks()
    } catch {
        print("Error: \(error)")
    }
}
RunLoop.main.run()
ARuntime error: Task group throws and cancels remaining tasks
BCompilation error: 'throw' used in non-throwing closure
CNo error; prints 1 and 3
DDeadlock because tasks wait on each other
Attempts:
2 left
💡 Hint
Check if the closure passed to addTask supports throwing errors.
📝 Syntax
advanced
1:30remaining
Correct syntax for adding tasks with return values in a task group
Which option shows the correct syntax to add tasks returning Int values in a Swift task group?
Swift
await withTaskGroup(of: Int.self) { group in
    // Add tasks here
}
Agroup.addTask(async { 5 })
Bgroup.addTask { await 5 }
Cgroup.addTask { return 5 }
Dgroup.addTask { throw 5 }
Attempts:
2 left
💡 Hint
Remember the closure passed to addTask can be async but does not require 'await' for returning a value.
🚀 Application
expert
2:30remaining
Calculate sum of squares using task groups concurrently
Given this Swift code, what is the value of 'total' after execution?
Swift
import Foundation

func sumOfSquares(_ numbers: [Int]) async -> Int {
    await withTaskGroup(of: Int.self) { group in
        for number in numbers {
            group.addTask {
                number * number
            }
        }

        var sum = 0
        for await value in group {
            sum += value
        }
        return sum
    }
}

Task {
    let total = await sumOfSquares([1, 2, 3, 4])
    print(total)
}
RunLoop.main.run()
A30
B20
C10
D25
Attempts:
2 left
💡 Hint
Calculate each number squared and add them all: 1² + 2² + 3² + 4².