Menu
CoddyTech

Pola Singleton

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 42 dari 57.

design pattern adalah solusi yang telah terbukti untuk masalah desain yang umum. Pola singleton memastikan sebuah class memiliki tepat satu instance yang dapat diakses dari mana saja. Di Swift, pola ini menggunakan static let yang menyimpan instance tersebut, serta private init agar tidak ada yang bisa membuat instance lain:

final class Settings {
    static let shared = Settings()
    var theme = "light"

    private init() {}
}

Settings.shared.theme = "dark"
print(Settings.shared.theme)

Output:

dark

Setiap penggunaan Settings.shared merujuk ke object yang sama, sehingga perubahan yang dibuat di satu bagian program terlihat di mana-mana. static let dibuat secara malas saat pertama kali digunakan dan tetap aman meskipun beberapa thread dimulai bersamaan:

final class Counter {
    static let shared = Counter()
    private(set) var hits = 0
    private init() {}
    func hit() { hits += 1 }
}

func pageA() { Counter.shared.hit() }
func pageB() { Counter.shared.hit(); Counter.shared.hit() }
pageA()
pageB()
print(Counter.shared.hits)
print(Counter.shared === Counter.shared)

Output:

3
true

Karena penginisialisasinya bersifat private, Settings() tidak compile di luar class, sehingga janji "hanya satu" tetap terjaga:

// let other = Settings()   // error: inisialisator 'Settings' tidak dapat diakses karena tingkat perlindungan 'private'

Gunakan singleton secukupnya. Singleton adalah state global: kode apa pun dapat mengubahnya, dan pengujian tidak dapat dengan mudah dimulai dari salinan yang bersih. Singleton cocok untuk hal-hal yang benar-benar hanya ada satu per program, seperti logger atau konfigurasi aplikasi; meneruskan object sebagai parameter sering kali lebih jelas.

// Lebih mudah diuji: logger diteruskan sebagai argumen
func process(order: Order, log: Logger) { log.write("processing \(order.id)") }
challenge icon

Tantangan

Mudah

Lengkapi singleton Logger. Singleton ini memiliki instance static let shared, initializer privat, array entries dengan private(set), dan log(_:level:), yang menyimpan [INFO] message atau [ERROR] message (level-nya adalah info atau error). errorCount adalah property komputasi. Kode yang disediakan memanggil Logger.shared dari dua fungsi yang berbeda, jadi keduanya harus mengakses instance yang sama.

Kode yang disediakan membaca baris info,message atau error,message, mengirim baris info melalui handleInfo dan baris error melalui handleError, lalu mencetak setiap entri dan errors: 1.

Tuliskan kodemu di Logger.swift dan Functions.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
    let p = line.split(separator: ",", maxSplits: 1).map(String.init)
    if p[0] == "error" { handleError(p[1]) } else { handleInfo(p[1]) }
}
for e in Logger.shared.entries { print(e) }
print("errors: \(Logger.shared.errorCount)")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift