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:
darkSetiap 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
trueKarena 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)") }Tantangan
MudahLengkapi 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)")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift