😺

【Swift】カスタムSequenceでCounterを作る

2024/10/21に公開

はじめに

記事の要約

  • Sequenceプロトコルに準拠したカスタムの型を定義することで、柔軟なfor-inループが実現できる
  • カスタムSequenceをfor-inループやwhileで使用する方法

環境

  • Xcode 16.0
  • Swift 6.0

カスタムSequence

0からhowHighまでを順番にカウントアップするカスタムSequenceです。

struct Counter: Sequence {

    // カウントの上限
    let howHigh: Int
    
    struct Iterator: IteratorProtocol {
        
        var value: Int = 0
        let howHigh: Int
        
        mutating func next() -> Int? {
            guard value <= howHigh else { return nil }
            defer { value += 1 }
            return value
        }
    }
    
    func makeIterator() -> Iterator {
        Iterator(howHigh: howHigh)
    }
    
}

for-inでの使用

// カスタムSequenceをfor-inループで利用
for counter in Counter(howHigh: 10) {
    print(counter)
}
Output
0
1
2
3
4
5
6
7
8
9
10

whileでの使用

// カスタムSequenceをwhileで利用
var iterator = Counter(howHigh: 10).makeIterator()
while let next = iterator.next() {
    print(next)
}
Output
0
1
2
3
4
5
6
7
8
9
10

Discussion