Middle
Šta je state, state object i observed object u razvoju iOS?
sobes.tech АИ
Одговор од АИ
State — ово је обмот својства у SwiftUI-ју који омогућава управљање локалним стањем приказа. Када се промени вредност својства обложеног у @State, приказ се аутоматски ажурира.
StateObject — ово је обмот својства у SwiftUI-ју за креирање и управљање објектима који одговарају протоколу ObservableObject, који су део животног циклуса приказа. Ефективно за објекте који су креирани унутар приказа и живе заједно са њим.
ObservedObject — ово је обмот својства у SwiftUI-ју за праћење референци на постојеће објекте који одговарају протоколу ObservableObject, који су пренети споља. SwiftUI прати промене у тим објектима и ажурира приказ.
Упоредна табела:
| Обмот | Намена | Поседовање | Пример употребе |
|---|---|---|---|
@State |
Локално стање приказа | Приказ | Једноставан бројач, флаг видљивости |
@StateObject |
Креирање и поседовање ObservableObject |
Приказ | Модел приказа (ViewModel), креиран у приказу |
@ObservedObject |
Праћење ObservableObject који је пренет |
Спољашњи извор | Модел приказа (ViewModel), пренет из родитељског приказа |
Пример употребе @State:
struct CounterView: View {
@State private var count: Int = 0 // Локално стање
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Промена стања изазива ажурирање
}
}
}
}
Пример употребе @StateObject и @ObservedObject:
import SwiftUI
// ObservableObject за модел података
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Креирамо и поседујемо примерак DataModel
@StateObject private var localData = DataModel(value: "Почетна локална вредност")
var body: some View {
VStack {
Text("Локални подаци: \(localData.value)")
Button("Промени локалне податке") {
localData.value = "Промењена локална вредност \(Int.random(in: 1...100))"
}
// Преносимо localData у дечије приказе
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Пратимо примерак DataModel који је пренет од родитеља
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Пратени подаци у детету: \(observedData.value)")
Button("Промени пратене податке") {
observedData.value = "Промењено из детета \(Int.random(in: 1...100))"
}
}
}
}