Ce sunt state, obiectul de stare și obiectul observat în dezvoltarea iOS?
sobes.tech AI
Răspuns de la AI
State — este un wrapper de proprietate în SwiftUI care permite gestionarea stării locale a vizualizării. Când valoarea proprietății învelite în @State se schimbă, vizualizarea se actualizează automat.
StateObject — este un wrapper de proprietate în SwiftUI pentru crearea și gestionarea obiectelor care respectă protocolul ObservableObject, care fac parte din ciclul de viață al vizualizării. Eficient pentru obiecte create în interiorul vizualizării și care trăiesc împreună cu ea.
ObservedObject — este un wrapper de proprietate în SwiftUI pentru gestionarea referințelor către obiecte existente care respectă protocolul ObservableObject, și care au fost transmise din exterior. SwiftUI monitorizează modificările acestor obiecte și actualizează vizualizarea.
Tabel comparativ:
| Wrapper | Scop | Proprietate | Exemplu de utilizare |
|---|---|---|---|
@State |
Stare locală a vizualizării | Vizualizarea | Contor simplu, flag de vizibilitate |
@StateObject |
Crearea și gestionarea ObservableObject |
Vizualizarea | Model de vizualizare (ViewModel) creat în vizualizare |
@ObservedObject |
Monitorizarea unui ObservableObject transmis |
Sursa externă | Model de vizualizare (ViewModel) transmis de la părinte |
Exemplu de utilizare @State:
struct CounterView: View {
@State private var count: Int = 0 // Stare locală
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Modificarea stării declanșează actualizarea
}
}
}
}
Exemplu de utilizare @StateObject și @ObservedObject:
import SwiftUI
// ObservableObject pentru modelul de date
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Crează și deține o instanță de DataModel
@StateObject private var localData = DataModel(value: "Valoare inițială locală")
var body: some View {
VStack {
Text("Date locale: \(localData.value)")
Button("Schimbă datele locale") {
localData.value = "Valoare schimbată local \(Int.random(in: 1...100))"
}
// Transmite localData către o vizualizare copil
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Monitorizează instanța de DataModel transmisă din părinte
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Date observate în copil: \(observedData.value)")
Button("Schimbă datele observate") {
observedData.value = "Schimbat din copil \(Int.random(in: 1...100))"
}
}
}
}