Sobes.tech
Middle

Kas ir state, state object un observed object iOS izstrādē?

sobes.tech AI

Atbilde no AI

State — SwiftUI īpašības ietvars, kas ļauj pārvaldīt vietējo skata stāvokli. Mainot @State ietverto īpašību vērtību, skats automātiski tiek atjaunināts.

StateObject — SwiftUI īpašības ietvars, kas paredzēts ObservableObject protokolam atbilstošu objektu izveidei un pārvaldībai, kas ir daļa no skata dzīves cikla. Efektīvi tiem objektiem, kas ir izveidoti iekšpusē skata un ar to saistīti.

ObservedObject — SwiftUI īpašības ietvars, kas paredzēts, lai pārvaldītu saites uz esošiem ObservableObject protokolam atbilstošiem objektiem, kas ir nodoti no ārpuses. SwiftUI seko šo objektu izmaiņām un atjaunina skatu.

Salīdzinošā tabula:

Ietvars Mērķis Piederība Piemērs lietošanai
@State Vietējais skata stāvoklis Skats Vienkāršs skaitītājs, redzamības karodziņš
@StateObject ObservableObject izveide un piederība Skats Skata modeļa (ViewModel) izveide skata iekšpusē
@ObservedObject Uzraudzība ObservableObject, kas nodots Ārējais avots Skata modeļa (ViewModel), kas nodots no vecāka skata

Piemērs @State lietošanai:

struct CounterView: View {
    @State private var count: Int = 0 // Vietējais stāvoklis

    var body: some View {
        VStack {
            Text("Skaits: \(count)")
            Button("Palielināt") {
                count += 1 // Stāvokļa izmaiņas automātiski atjauno skatu
            }
        }
    }
}

Piemērs @StateObject un @ObservedObject lietošanai:

import SwiftUI

// ObservableObject datu modelis
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Izveido un pieder DataModel instancei
    @StateObject private var localData = DataModel(value: "Sākotnējā vietējā vērtība")

    var body: some View {
        VStack {
            Text("Vietējie dati: \(localData.value)")
            Button("Mainīt vietējos datus") {
                localData.value = "Mainīti vietējie dati \(Int.random(in: 1...100))"
            }
            
            // Nodod localData bērna skata iekšpusē
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Uzrauga nodoto DataModel instancei
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Uzraudzītie dati bērnā: \(observedData.value)")
            Button("Mainīt uzraudzītos datus") {
                observedData.value = "Mainīts no bērna \(Int.random(in: 1...100))"
            }
        }
    }
}