Iterator 패턴에 대해 공부를 하다보니, Sequence라는 녀석에 대한 공부가 필요한 것 같아서 빠르게 애플 공식문서를 보고 공부해보았습니다 ㅎㅎ!
protocol Sequence
Sequence 프로토콜은 어떤 요소들에 대한 순차적(Sequential), 반복적(Iterated) 접근을 제공하는 타입입니다.
Sequence?
Sequence는 한번에 접근할 수 있는 값들의 목록을 말합니다. Sequence의 요소들을 반복적으로 접근하는 가장 대표적인 방법은 for-in 루프가 있습니다. 이 Sequence 프로토콜을 채택하면, Sequence 에 대한 순차적인 접근(Sequential access)을 위해 이미 기본적으로 구현되어 있는 수많은 operation들에 접근할 수 있는 능력이 생긴다고 합니다.!
operation들 ) contains, max, min, filter, map 등등...!
반복적인 접근
이 파트에서 destructive iteration이라는 용어를 보고 조금 이해가 어려웠습니다. "파괴적인 반복????" 그를 계속 보다가 이해한 대로라면, Sequence를 여러번 반복하여 실행한다면, Sequence에 대한 순서를 보장하지 않는다는 것입니다. 즉 Sequence에 대한 순서가 파괴된다. 라는 의미로 이해하였습니다.
문장에서도 나오지만, 여러개의 for-in 루프를 실행했을 때, Sequence가 반복을 이어서 진행한다거나, 첫 요소부터 다시 시작하리라는 보장은 없다고 합니다. 그래서 이를 destructive iteration이라고 하는 것 같습니다...
그렇다면 ! non-destructive iteration을 만들어 주기 위해서는 Collection 프로토콜을 추가적으로 채택해주어야 합니다.
Conforming to Sequence Protocol
커스텀 타입이 Sequence 프로토콜을 준수하게 만든다면, 큰 노력을 들이지 않고 많은 유용한 operation(contains, map, filter, max, min, ... )들을 사용할 수 있습니다.
커스텀 타입에 Sequence 프로토콜을 추가하기 위해서는, makeIterator() 메서드를 추가하여 Iterator 를 반환해주는 방법을 사용하거나,
커스텀 타입 자체가 Iterator로 동작하게 만들고 싶다면, IteratorProtocol 또한 채택하여 구현해주면 됩니다.
struct MySequence: Sequence, IteratorProtocol {
var count: Int
mutating func next() -> Int? {
if count == 0 {
return nil
} else {
defer { count -= 1 }
return count
}
}
}
let mySeq = MySequence(count: 5)
mySeq.map({ print($0) })
참고 문서
https://developer.apple.com/documentation/swift/sequence
'Swift' 카테고리의 다른 글
Swift ) URL에 한글이 들어갈때? (addingPercentEncoding) (0) | 2022.03.29 |
---|---|
Type Methods (static func & class func) (0) | 2022.03.23 |
Unowned? (0) | 2021.02.28 |
Dispatch(2) : Sync / Async / main / global (0) | 2021.01.13 |
Dispatch(1) : What is Dispatch and Dispatch Queue? (0) | 2021.01.13 |