Sobes.tech
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))"
            }
        }
    }
}