Înainte de Swift 5.9, gestiunea stării reactive în SwiftUI depindea exclusiv de framework-ul Combine și protocolul ObservableObject. Orice modificare a unei proprietăți marcate cu @Published forța re-evaluarea întregului view, chiar dacă acel view consuma o proprietate complet diferită, neafectată de modificare.
Noul framework Observation (introdus în import Observation) revoluționează acest model prin macrocomanda @Observable. Aceasta injectează invizibil un registru de observare care urmărește cu precizie chirurgicală doar câmpurile citite în corpul metodei body a view-ului curent (field-level tracking).
import SwiftUI
import Observation
// 1. Declararea clasei de model:
// Macrocomanda @Observable sintetizează automat conformarea la protocolul Observable
// și instrumentează fiecare proprietate stocată fără a necesita adnotarea manuală @Published!
@Observable
final class UserManager {
var nume: String = "Dexter"
var puncte: Int = 100
var esteActiv: Bool = true
// Proprietățile care nu trebuie observate pot fi ignorate explicit:
@ObservationIgnored
var tokenIntern: String = "secret_xyz"
}
// 2. Consumul în interfața declarativă:
struct ProfileView: View {
// Modelul este pasat direct, fără a mai fi necesar @ObservedObject sau @StateObject!
@Bindable var manager: UserManager
var body: some View {
VStack(spacing: 16) {
// Când utilizatorul tastează în TextField, se va re-randa doar această componentă:
TextField("Nume utilizator", text: $manager.nume)
.textFieldStyle(.roundedBorder)
Text("Puncte acumulate: \(manager.puncte)")
.font(.headline)
Button("Adaugă 10 puncte") {
manager.puncte += 10
}
}
.padding()
}
}
De Ce Observation Este Superior Vechiului Model Combine
- Performanță Extremă: Nu mai există randări parazite în ierarhia de view-uri SwiftUI. Dacă un view afișează doar
manager.nume, modificarea luimanager.punctenu va re-evalua view-ul respectiv! - Sintaxă Curată: Elimină zgomotul generat de
@Publishedpe fiecare proprietate individuală. - Compatibilitate cu Actori și Concurrency: Clasele marcate cu
@Observablepot fi integrate curat cu modelele moderne de concurență din Swift 6 fără dependențe asincrone pe Combine publishers.