0
0
Swiftprogramming~10 mins

Async sequences (AsyncSequence) in Swift - Step-by-Step Execution

Choose your learning style9 modes available
Concept Flow - Async sequences (AsyncSequence)
Start AsyncSequence
Call async iterator
Wait for next element asynchronously
Receive element or nil
Process element
Repeat wait for next element
This flow shows how an async sequence produces elements one by one, waiting asynchronously for each before continuing or ending.
Execution Sample
Swift
struct Counter: AsyncSequence {
  typealias Element = Int
  struct AsyncIterator: AsyncIteratorProtocol {
    var count = 0
    mutating func next() async -> Int? {
      guard count < 3 else { return nil }
      defer { count += 1 }
      return count
    }
  }
  func makeAsyncIterator() -> AsyncIterator { AsyncIterator() }
}

let counter = Counter()
for await num in counter {
  print(num)
}
This code defines an async sequence that counts from 0 to 2 asynchronously, printing each number.
Execution Table
StepActioncount valuenext() returnsOutput
1Call next(), count=0 < 300Print 0
2Call next(), count=1 < 311Print 1
3Call next(), count=2 < 322Print 2
4Call next(), count=3 !< 33nilEnd loop
💡 next() returns nil when count reaches 3, ending the async sequence.
Variable Tracker
VariableStartAfter 1After 2After 3Final
count01233
Key Moments - 3 Insights
Why does next() return nil at step 4?
Because the count reached 3, which fails the guard condition count < 3, so next() returns nil to signal the end of the sequence (see execution_table step 4).
Why is count incremented after returning the value?
The defer statement increments count after returning the current value, so the returned number is the old count before increment (see execution_table steps 1-3).
How does the for-await loop know when to stop?
It stops when next() returns nil, which means no more elements are available (see execution_table step 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of count when next() returns 1?
A0
B1
C2
D3
💡 Hint
Check execution_table row 2 under 'count value' and 'next() returns'.
At which step does the async sequence end?
AStep 2
BStep 3
CStep 4
DStep 1
💡 Hint
Look for when next() returns nil in execution_table.
If we change the guard to count < 5, how many times will next() return a number?
A5 times
B4 times
C3 times
D6 times
💡 Hint
The sequence returns numbers while count < 5, so count values 0 to 4 (see variable_tracker).
Concept Snapshot
AsyncSequence lets you produce values asynchronously one by one.
Implement next() async -> Element? to yield values or nil to end.
Use for await to loop over async sequences.
next() suspends until the next value is ready.
Defer can update state after returning a value.
Full Transcript
This visual execution trace shows how an AsyncSequence in Swift works step-by-step. The Counter struct produces numbers 0, 1, and 2 asynchronously. Each call to next() checks if count is less than 3. If yes, it returns the current count and then increments it. When count reaches 3, next() returns nil, signaling the end of the sequence. The for-await loop prints each number as it arrives and stops when nil is returned. The variable tracker shows how count changes after each next() call. Key moments clarify why next() returns nil and how defer affects count. The quiz tests understanding of count values, sequence end, and changing the guard condition.