Čo je to stav, stavový objekt a sledovaný objekt v vývoji iOS?
sobes.tech AI
Odpoveď od AI
State je obal vlastnosti vo SwiftUI, ktorý umožňuje riadiť lokálny stav zobrazenia. Pri zmene hodnoty vlastnosti, ktorá je zabalená v @State, sa zobrazenie automaticky aktualizuje.
StateObject je obal vlastnosti vo SwiftUI pre vytváranie a správu objektov, ktoré zodpovedajú protokolu ObservableObject, a ktoré sú súčasťou životného cyklu zobrazenia. Efektívne pre objekty, ktoré sú vytvorené vnútri zobrazenia a žijú s ním.
ObservedObject je obal vlastnosti vo SwiftUI pre sledovanie odkazov na existujúce objekty, ktoré zodpovedajú protokolu ObservableObject, a ktoré boli odovzdané zvonku. SwiftUI sleduje zmeny v týchto objektoch a aktualizuje zobrazenie.
Porovnávacia tabuľka:
| Obal | Účel | Vlastníctvo | Príklad použitia |
|---|---|---|---|
@State |
Lokálny stav zobrazenia | Zobrazenie | Jednoduchý čítač, vlajka viditeľnosti |
@StateObject |
Vytváranie a vlastníctvo ObservableObject |
Zobrazenie | Model zobrazenia (ViewModel), vytvorený v zobrazení |
@ObservedObject |
Sledovanie ObservableObject, odovzdaného |
Vnútorný zdroj | Model zobrazenia (ViewModel), odovzdaný z rodičovského zobrazenia |
Príklad použitia @State:
struct CounterView: View {
@State private var count: Int = 0 // Lokálny stav
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Zmena stavu vyvolá aktualizáciu
}
}
}
}
Príklad použitia @StateObject a @ObservedObject:
import SwiftUI
// ObservableObject pre model dát
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Vytvárame a vlastníme inštanciu DataModel
@StateObject private var localData = DataModel(value: "Počiatočná lokálna hodnota")
var body: some View {
VStack {
Text("Lokálne dáta: \(localData.value)")
Button("Zmeniť lokálne dáta") {
localData.value = "Zmenená lokálna hodnota \(Int.random(in: 1...100))"
}
// Odovzdávame localData do detského zobrazenia
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Sledujeme inštanciu DataModel, odovzdanú od rodiča
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Sledované dáta v dieťati: \(observedData.value)")
Button("Zmeniť sledované dáta") {
observedData.value = "Zmenené z dieťaťa \(Int.random(in: 1...100))"
}
}
}
}