Co je to stav, stavový objekt a sledovaný objekt v iOS vývoji?
sobes.tech AI
Odpověď od AI
State je obal vlastnosti ve SwiftUI, který umožňuje řídit místní stav zobrazení. Při změně hodnoty vlastnosti, která je zabalená v @State, se zobrazení automaticky aktualizuje.
StateObject je obal vlastnosti ve SwiftUI pro vytváření a správu objektů odpovídajících protokolu ObservableObject, které jsou součástí životního cyklu zobrazení. Je efektivní pro objekty, které jsou vytvořeny uvnitř zobrazení a s ním žijí.
ObservedObject je obal vlastnosti ve SwiftUI pro sledování odkazů na existující objekty odpovídající protokolu ObservableObject, které byly předány zvenčí. SwiftUI sleduje změny v těchto objektech a aktualizuje zobrazení.
Srovnávací tabulka:
| Obal | Účel | Vlastnictví | Příklad použití |
|---|---|---|---|
@State |
Lokální stav zobrazení | Zobrazení | Jednoduchý čítač, příznak viditelnosti |
@StateObject |
Vytváření a vlastnictví ObservableObject |
Zobrazení | Model zobrazení (ViewModel), vytvořený v zobrazení |
@ObservedObject |
Sledování ObservableObject, předaného |
Vnější zdroj | Model zobrazení (ViewModel), předaný z rodičovského zobrazení |
Příklad použití @State:
struct CounterView: View {
@State private var count: Int = 0 // Lokální stav
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Změna stavu vyvolá aktualizaci
}
}
}
}
Příklad použití @StateObject a @ObservedObject:
import SwiftUI
// ObservableObject pro model dat
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Vytváříme a vlastním instanci DataModel
@StateObject private var localData = DataModel(value: "Počáteční místní hodnota")
var body: some View {
VStack {
Text("Místní data: \(localData.value)")
Button("Změnit místní data") {
localData.value = "Změněná místní hodnota \(Int.random(in: 1...100))"
}
// Předáváme localData do dětského zobrazení
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Sledujeme instanci DataModel předanou z rodiče
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Sledovaná data v dítěti: \(observedData.value)")
Button("Změnit sledovaná data") {
observedData.value = "Změněno z dítěte \(Int.random(in: 1...100))"
}
}
}
}