Swift

Sequence

JoonSwift 2022. 1. 28. 01:33

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

 

Apple Developer Documentation

 

developer.apple.com