Czym jest stan, obiekt stanu i obserwowany obiekt w rozwoju iOS?
sobes.tech AI
Odpowiedź od AI
State — to opakowanie właściwości w SwiftUI, które pozwala zarządzać lokalnym stanem widoku. Przy zmianie wartości właściwości opakowanej w @State, widok jest automatycznie odświeżany.
StateObject — to opakowanie właściwości w SwiftUI do tworzenia i zarządzania obiektami spełniającymi protokół ObservableObject, które są częścią cyklu życia widoku. Efektywne dla obiektów tworzonych wewnątrz widoku i z nim żyjących.
ObservedObject — to opakowanie właściwości w SwiftUI do zarządzania odwołaniami do istniejących obiektów spełniających protokół ObservableObject, które zostały z zewnątrz przekazane. SwiftUI śledzi zmiany w tych obiektach i odświeża widok.
Tabela porównawcza:
| Opakowanie | Przeznaczenie | Własność | Przykład użycia |
|---|---|---|---|
@State |
Lokalny stan widoku | Widok | Prosty licznik, flaga widoczności |
@StateObject |
Tworzenie i własność ObservableObject |
Widok | Model widoku (ViewModel) tworzony w widoku |
@ObservedObject |
Śledzenie ObservableObject przekazanego |
Zewnętrzne źródło | Model widoku (ViewModel) przekazany z rodzica |
Przykład użycia @State:
struct CounterView: View {
@State private var count: Int = 0 // Lokalny stan
var body: some View {
VStack {
Text("Count: \(count)")
Button("Zwiększ") {
count += 1 // Zmiana stanu powoduje odświeżenie
}
}
}
}
Przykład użycia @StateObject i @ObservedObject:
import SwiftUI
// ObservableObject dla modelu danych
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Tworzenie i posiadanie instancji DataModel
@StateObject private var localData = DataModel(value: "Wartość początkowa")
var body: some View {
VStack {
Text("Dane lokalne: \(localData.value)")
Button("Zmień dane lokalne") {
localData.value = "Zmienione dane lokalne \(Int.random(in: 1...100))"
}
// Przekazanie localData do widoku potomnego
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Śledzenie instancji DataModel przekazanej od rodzica
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Obserwowane dane w dziecku: \(observedData.value)")
Button("Zmień dane w dziecku") {
observedData.value = "Zmienione z dziecka \(Int.random(in: 1...100))"
}
}
}
}