티스토리 뷰

반응형

 

 

 

안녕하세요. developer, 멍구입니다. 🤗
오늘은 Sequence protocol, 시퀀스 프로토콜을 채택하고 사용하는 법에 대한 애플 개발자 공식문서를 보도록 하겠습니다.

 


Conforming to the Sequence Protocol
Sequence 프로토콜 채택(준수) 및 사용법


어떠한 커스텀(Custom) 타입에 Sequence 프로토콜을 채택(준수) 해서 사용하는 것은 지난번 포스팅에서 돌아본 for-in 루프, constains(_:) 메서드 등의 기능 이외에 많은 유용한 연산기능들을 지원합니다. 

만약 커스텀 타입에 Sequence 프로토콜을 채택하여 사용하기 위해서는 Sequence와 iterator(반복자)를 충분하게 반환하는 makeIterator() 메서드를 정의해 주는 것이 필요합니다. 

// - makeIterator() 메서드는 Sequence의 값들 상의 반복자(Iterator)를 반환합니다.
func makeIterator() -> Self.Iterator
makeIterator() 메서드의 구현은 필수입니다. 하지만 별도로 구현하지 않아도 Default로 해당 메서드를 지원합니다.

 

 

struct CountDown: Sequence, IteratorProtocol {
    var count: Int
    
    // 구조체 내의 값을 구조체 내부에서 변화시키는 경우, mutating 키워드를 사용해야 내부에서 변화시킬 수 있습니다.
    mutating func next() -> Int? {
        if self.count == 0 {
            return nil
        }
        
        // 해당 블록이 종료 될 때 count는 1 감소 시킵니다.
        defer { count -= 1 }
        return count
    }
}

let threeToGo = CountDown(count: 3)

// result : 3, 2, 1
for index in threeToGo {
    print(index)
}

 

위의 코드는 Sequence 프로토콜을 채택한 구조체인 CountDown 구조체를 보여주고 있습니다.

Sequence 프토토콜을 준수하면서 그 이점을 취하려면, makeIterator() 메서드가 정의되는 것이 필요합니다.

위에 CountDown 구조체에서 정의하고 있는 next 메서드는 IteratorProtocol을 준수하면서 구현해야하는 메서드입니다.해당 메서드는 다음 순회 간 반환되는 값을 정의하는데, count 변수 값이 0이 되면 nil을 반환하고 순회탐색을 종료하게 됩니다. 
-> 즉, next의 끝에는 nil이 반환되게 됩니다.

이처럼 iterator 메서드의 커스텀 정의를 통해 사용자 입맛에 맞는 순회방식을 설정할 수 있습니다.
가령 위의 구조체는 3 -> 2 -> 1 -> END의 순회 방식을 갖으며 이에 따라 for-in 루프 순회간 값을 출력하게 됩니다. 

 

 

 


Expected Performance
예상되는 성능

Sequence의 경우 한번의 방문 간 O(1)의 시간복잡도(Time Complexity)로 작업할 수 있도록 제공하고 있습니다. Sequence 프로토콜은 요소 접근에 대해 또다른 요구사항을 만들지 않습니다.

그렇기에, 모든 Sequence를 방문, 순회하는 작업의 경우 O(N)의 시간 복잡도를 갖고 있다고 보면 됩니다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함