โ 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]