[swift] 이터레이터 패턴

이터레이터 패턴은 객체 컬렉션을 순차적으로 접근하는 방법을 제공하는 디자인 패턴입니다. 이터레이터는 각 요소에 대한 접근을 추상화하고 컬렉션의 내부 구조를 노출시키지 않으며, 코드의 가독성과 유지보수를 향상시킵니다.

이터레이터 패턴의 구조

이터레이터 패턴은 크게 두 가지 구성 요소로 구성됩니다.

  1. 이터레이터(Iterator): 컬렉션의 요소에 접근하기 위한 인터페이스를 정의합니다. 현재 요소를 반환하고 다음 요소로 이동하는 메서드가 포함됩니다.

  2. 컬렉션(Collection): 여러 요소를 포함하고 있는 객체입니다. 이터레이터를 생성하여 반환하는 메서드를 정의합니다.

Swift에서의 이터레이터 패턴

Swift에서 이터레이터 패턴을 구현하는 가장 간단한 방법은 Iterator 프로토콜을 채택하여 컬렉션을 통해 이터레이터를 생성하는 것입니다.

이터레이터 패턴을 활용하는 예시를 보겠습니다.

// 이터레이터 프로토콜 정의
protocol Iterator {
    associatedtype T
    func hasNext() -> Bool
    func next() -> T?
}

// 컬렉션 클래스
class MyCollection<T>: Sequence {
    var elements: [T] = []
    
    func makeIterator() -> AnyIterator<T> {
        var currentIndex = 0
        return AnyIterator {
            if currentIndex < self.elements.count {
                defer { currentIndex += 1 }
                return self.elements[currentIndex]
            } else {
                return nil
            }
        }
    }
}

// 컬렉션 객체 생성
var collection = MyCollection<Int>()
collection.elements = [1, 2, 3]

// 이터레이터를 이용한 순회
for element in collection {
    print(element)
}

위 코드에서 MyCollection 클래스는 Sequence를 채택하여 makeIterator() 메서드를 구현하여 이터레이터를 생성합니다. 이를 통해 for...in 구문을 통해 컬렉션을 순회할 수 있습니다.

이러한 방식으로 이터레이터를 활용하면 컬렉션의 내부 구조를 노출시키지 않으면서도 요소에 접근할 수 있는 유연하고 안전한 방법을 제공할 수 있습니다.

결론

이터레이터 패턴은 객체 컬렉션을 효과적으로 순회하고 각 요소에 접근하기 위한 간단하고 유연한 방법을 제공합니다. Swift의 이터레이터 프로토콜을 활용하면 간단한 반복 작업을 효율적으로 처리할 수 있습니다.