[Swift] AsyncSequence

공식 문서 번역용

이것의 elements에 대한 비동기, 순차적, 반복 접근을 제공하는 형식

Declaration

protocol AsyncSequence

Overview

AsyncSequence는 Sequence type과 닮았다. - 한번에 하나씩 진행할 수 있는 value의 list를 제공하는 - 여기에 비동기를 추가한다. AsyncSequence는 처음 사용할 때, 사용 가능한 value의 전부, 일부, 또는 전혀 없을 수 있다. (무슨 의미인지 잘 모르겠음.) 대신에, 너는 value를 사용할 수 있을 때 await 를 사용해서 받을 수 있다.

Seqeunce와 마찬가지로, for await-in loop와 함께 AsyncSequence를 통해 일반적으로 반복할(interated) 수 있다. 그러나 caller는 잠재적으로 value를 기다려야하기 떄문에, await를 사용한다.

다음 예제는 Counter를 반복(iterate)하는 법을 보여준다, 1부터 howHigh value까지 생성하는 custom AsyncSequence

for await i in Counter(howHigh: 10) {
    print(i, terminator: " ")
}
// Prints: 1 2 3 4 5 6 7 8 9 10

AsyncSequence는 value를 생성하거나 포함할 수 없다. 이건 단지 그것들에 잡근하는 방법을 정의한다. value의 type을 Element라는 연관된 type으로 정의하는 것과 함께, AsyncSequence는 makeAsyncIterator() method를 정의한다. 이건 AsyncInteratortype의 instance를 반환한다. 기존에 InteratorProtocol처럼, AsyncInteratorProtocol은 element를 생산하기 위한 next() method 하나를 정의한다. 차이점은 AsyncIterator가 next() method를 await keyword와 함께 다음 value를 기다리기 위해 caller에게 요청하는 async로 정의한다는 것이다.

AsyncSequence는 또한 기존 라이브러리에 기본 Sequence에 제공되는 operation으로 모델링된, 당신이 받은 element를 처리하기 위한 method들을 정의한다. method의 category는 2가지가 있다 : 하나의 value를 반환하는 것들, 그리고 다른 AsyncSequence를 반환하는 것들

Single-value method는 for await-in loop의 필요를 제거한다, 그리고 대신에 await를 한 번 호출한다.

예를 들면, contains(_:) method는 AsyncSequence 안에 value가 존재한다면 Boolean value를 반환한다. 이전 예시로 부터 Counter sequence가 주어졌을 때, 하나의 라인의 호출과 함께 sequence member의 존재를 테스트해볼 수 있다:

let found = await Counter(howHigh: 10).contains(5)

다른 AsyncSequence를 반환하는 method는 method의 의미 체계에 특정한 형식을 반환합니다. 예를 들어,

.map(_:) method는 AsyncMapSequence를 반환한다.(또는 ThrowingMapSequence, 만약 map method를 제공하는 closure가 error를 throw할 수 있다면) 이러한 반환된 sequence는 sequence의 다음 member를 기다리지 않으므로 caller가 시작할 시기를 결정할 수 있다. 일반적으로, 당신이 시작한 기존 AsyncSequence와 같이 for await-in과 함께 그 sequence를 반복할 수 있을 것이다. 다음 예시에 따르면, 그 map method는 Counter sequence로 받은 Int를 각각 String으로 변환한다:

let stream = Counter(howHigh: 10)
    .map { $0 % 2 == 0 ? "Even" : "Odd" }
for await s in stream {
    print(s, terminator: " ")
}
// Prints: Odd Even Odd Even Odd Even Odd Even Odd Even