테스트 할 때도 마찬가지입니다. 예전엔 XCExpectation
을 썼는데
이제는 더 편해졌습니다.
A sequence is a list of values that you can step through one at a time. The most common way to iterate over the elements of a sequence is to use a for-in loop:
Iterator같은 느낌인데 또 Iterator는 아닙니다. Sequence
를 채택한 대표적인 타입은 Array
, Set
, Dictionary
등의 Collection
이 있는데 IteratorProtocol
을 채택하거나 makeIterator
를 구현하면 커스텀 타입도 Iterator가 되어 for in
문법을 채택할 수 있습니다.
var iterator = values.makeIterator()
while let value = iterator.next() {
// Do something
}
struct Countdown: Sequence, IteratorProtocol {
var count: Int
mutating func next() -> Int? {
if count == 0 {
return nil
} else {
defer { count -= 1 }
return count
}
}
}
let threeToGo = Countdown(count: 3)
for i in threeToGo {
print(i)
}
Document에서 발췌
A sequence should provide its iterator in O(1). The Sequence protocol makes no other requirements about element access, so routines that traverse a sequence should be considered O(n) unless documented otherwise.
iterator는 O(1)의 복잡도로 제공되므로 시퀀스를 횡단하는 동작은 별다른 표기가 없다면 O(n)이 될 것입니다.
AsyncSequence는 Async Task들이 시퀀스로 구현되어있는 형태입니다. 예시부터 보면,
struct QuakesTool {
static func main() async throws {
let endpointURL = URL(string: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.csv")!
for try await event in endpointURL.lines.dropFirst() {
let values = event.split(separator: ",")
let time = values[0]
let latitude = values[1]
let longitude = values[2]
let magnitude = values[4]
print("magnitude: \(magnitude), time: \(time), latitude: \(latitude), longitude: \(longitude)")
}
}
}
event
를 관리하고 dropFirst
를 사용할 수도 있습니다. Sequence
에서 사용하는 함수 중 상당수가 사용 가능합니다.URL.lines
)에서는 task 완료 순서대로 for
문 안의 context를 실행시킵니다. 즉, Task가 실행되는 데에는 정해진 순서가 없습니다.for in
안에서 컴파일러는 Iterator를 이런 식으로 핸들링합니다