Sobes.tech
Middle

Kas yra state, state object ir observed object iOS kūrime?

sobes.tech AI

Atsakymas iš AI

State — tai SwiftUI savybė, leidžianti valdyti vietinę vaizdo būseną. Kai keičiasi @State apimtos savybės reikšmė, vaizdas automatiškai atnaujinamas.

StateObject — tai SwiftUI savybė, skirta kurti ir valdyti ObservableObject protokolą atitinkančius objektus, kurie yra vaizdo gyvavimo ciklo dalis. Efektyvu tiems objektams, kurie kuriami viduje vaizdo ir su juo gyvena.

ObservedObject — tai SwiftUI savybė, skirta stebėti esamus ObservableObject objektus, kurie buvo perduoti iš išorės. SwiftUI stebi šiuose objektuose vykstančius pokyčius ir atnaujina vaizdą.

Lyginamoji lentelė:

Apvyniojimas Paskirtis Nuosavybė Pavyzdys naudojimo
@State Vietinis vaizdo būsenos valdymas Vaizdas Paprastas skaitiklis, matomumo žymeklis
@StateObject ObservableObject kūrimas ir nuosavybė Vaizdas Vaizdo modelis (ViewModel), sukurtas vaizde
@ObservedObject Stebėti ObservableObject, perduotą iš išorės Išorinis šaltinis Vaizdo modelis (ViewModel), perduotas iš tėvo vaizdo

@State naudojimo pavyzdys:

struct CounterView: View {
    @State private var count: Int = 0 // Vietinis būsenos

    var body: some View {
        VStack {
            Text("Skaitiklis: \(count)")
            Button("Padidinti") {
                count += 1 // Būsenos pakeitimas sukelia atnaujinimą
            }
        }
    }
}

@StateObject ir @ObservedObject pavyzdžiai:

import SwiftUI

// `ObservableObject` duomenų modeliui
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Sukuriame ir valdome DataModel egzempliorių
    @StateObject private var localData = DataModel(value: "Pradinis vietinis vertė")

    var body: some View {
        VStack {
            Text("Vietiniai duomenys: \(localData.value)")
            Button("Keisti vietinius duomenis") {
                localData.value = "Pakeista vietinė vertė \(Int.random(in: 1...100))"
            }
            
            // perduodame localData vaikų vaizdui
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Sekame perduotą DataModel egzempliorių
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Stebimi duomenys vaikui: \(observedData.value)")
            Button("Keisti stebimus duomenis") {
                observedData.value = "Pakeista iš vaiko \(Int.random(in: 1...100))"
            }
        }
    }
}