19.3. 异步序列

上一节中的 listPhotos(inGallery:) 方法会在拿到数组中的所有元素后,以异步的方式一次性返回整个数组。另一种方式是使用异步序列(asynchronous sequence),每次收到一个元素后对其进行处理。下面这段代码展示了如何遍历一个异步序列:

import Foundation
let handle = FileHandle.standardInput
for try await line in handle.bytes.lines {
    print(line)
}

与普通的 for-in 循环相比,上面的列子在 for 之后添加了 await 关键字。就像在调用异步函数或方法时一样,await 表明代码中有一个可能的悬点。for-await-in 循环会在每次循环开始的时候因为有可能需要等待下一个元素而挂起当前代码的执行。

想让自己创建的类型使用 for-in 循环需要遵循 Sequence 协议,这里也同理,如果想让自己创建的类型使用 for-await-in 循环,就需要遵循 AsyncSequence 协议。