ObservableObject & @ObservedObject
Penjelasan
@State cocok untuk data sederhana milik satu View, tapi untuk state yang lebih kompleks (mis. logic bisnis, data dari API, atau objek yang dipakai lebih dari satu View), pola yang lebih tepat adalah class yang conform ke protocol ObservableObject. Property di dalamnya yang ingin memicu pembaruan tampilan ditandai @Published — setiap kali nilainya berubah, ObservableObject mengirim sinyal ke semua View yang mengamatinya. Di sisi View, kamu terima objek itu lewat property wrapper @ObservedObject. Bedanya dengan @State: ObservableObject adalah class (reference type) sehingga bisa dibagikan (shared) ke banyak View tanpa duplikasi data, sedangkan @State menyimpan value type yang eksklusif milik satu View.
Contoh Konsep
import SwiftUI
class KeranjangViewModel: ObservableObject {
@Published var jumlahItem = 0
func tambah() {
jumlahItem += 1
}
}
struct KeranjangView: View {
@ObservedObject var viewModel: KeranjangViewModel
var body: some View {
VStack {
Text("Item: \(viewModel.jumlahItem)")
Button("Tambah Item") {
viewModel.tambah()
}
}
}
}
Praktikum
Buat class SkorViewModel: ObservableObject dengan @Published var skor = 0 dan method tambahSkor(). Buat SkorView yang menerima @ObservedObject var viewModel dan punya Button untuk memanggil tambahSkor().
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
@ObservedObject TIDAK bertanggung jawab membuat/menghidupkan objeknya — ia hanya mengamati objek yang sudah ada (biasanya diteruskan dari luar). Kalau View itu sendiri yang harus membuat instance pertama kali, pakai @StateObject (dibahas di topik selanjutnya), bukan @ObservedObject.