โ† Kembali ke Design Pattern
๐Ÿ”„
Behavioral

Iterator

Menyediakan cara untuk mengakses elemen koleksi secara berurutan tanpa membuka representasi internalnya.

Masalahnya

Sebuah koleksi punya struktur internal yang rumit (tree, graph, ring buffer). Kamu ingin melakukan iterasi tanpa membuka cara data itu disimpan.

Cara Kerja

  • โ€บMemisahkan logika traversal dari class koleksi
  • โ€บMendukung beberapa traversal independen sekaligus pada koleksi yang sama
  • โ€บMemungkinkan interface for-in / for-of yang seragam untuk semua koleksi
  • โ€บLazy iterator (Kotlin Sequences, Python generator) menghitung elemen hanya saat dibutuhkan
  • โ€บInternal iterator menyembunyikan loop-nya; external iterator memberi kendali ke pemanggil

Kapan Digunakan

โœ“Koleksi custom yang perlu mendukung loop for-in/for-of
โœ“Saat kamu butuh beberapa strategi traversal untuk koleksi yang sama
โœ“Menyembunyikan logika traversal yang rumit (traversal tree, pagination)
โœ“Lazy sequence di mana menghitung semua elemen di awal itu mahal

Contoh di Dunia Nyata

๐ŸŽ
iOS

IteratorProtocol + Sequence, IndexingIterator, for-in on any Collection type

๐Ÿค–
Android

Iterable<T>, Kotlin Sequences for lazy evaluation, Cursor for database rows

๐ŸŒ
Web

Symbol.iterator, Generator functions (function*), built-in Array/Map/Set iterators

Contoh Kode

Swift
struct Countdown: Sequence {
    let from: Int

    func makeIterator() -> CountdownIterator {
        CountdownIterator(current: from)
    }

    struct CountdownIterator: IteratorProtocol {
        var current: Int
        mutating func next() -> Int? {
            guard current >= 0 else { return nil }
            defer { current -= 1 }
            return current
        }
    }
}

let countdown = Countdown(from: 5)
for n in countdown { print(n) }  // 5, 4, 3, 2, 1, 0

// Works with all Sequence methods
print(countdown.contains(3))      // true
print(Array(countdown))           // [5, 4, 3, 2, 1, 0]