Sobes.tech
Middle

Čo je to stav, stavový objekt a sledovaný objekt v vývoji iOS?

sobes.tech AI

Odpoveď od AI

State je obal vlastnosti vo SwiftUI, ktorý umožňuje riadiť lokálny stav zobrazenia. Pri zmene hodnoty vlastnosti, ktorá je zabalená v @State, sa zobrazenie automaticky aktualizuje.

StateObject je obal vlastnosti vo SwiftUI pre vytváranie a správu objektov, ktoré zodpovedajú protokolu ObservableObject, a ktoré sú súčasťou životného cyklu zobrazenia. Efektívne pre objekty, ktoré sú vytvorené vnútri zobrazenia a žijú s ním.

ObservedObject je obal vlastnosti vo SwiftUI pre sledovanie odkazov na existujúce objekty, ktoré zodpovedajú protokolu ObservableObject, a ktoré boli odovzdané zvonku. SwiftUI sleduje zmeny v týchto objektoch a aktualizuje zobrazenie.

Porovnávacia tabuľka:

Obal Účel Vlastníctvo Príklad použitia
@State Lokálny stav zobrazenia Zobrazenie Jednoduchý čítač, vlajka viditeľnosti
@StateObject Vytváranie a vlastníctvo ObservableObject Zobrazenie Model zobrazenia (ViewModel), vytvorený v zobrazení
@ObservedObject Sledovanie ObservableObject, odovzdaného Vnútorný zdroj Model zobrazenia (ViewModel), odovzdaný z rodičovského zobrazenia

Príklad použitia @State:

struct CounterView: View {
    @State private var count: Int = 0 // Lokálny stav

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1 // Zmena stavu vyvolá aktualizáciu
            }
        }
    }
}

Príklad použitia @StateObject a @ObservedObject:

import SwiftUI

// ObservableObject pre model dát
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Vytvárame a vlastníme inštanciu DataModel
    @StateObject private var localData = DataModel(value: "Počiatočná lokálna hodnota")

    var body: some View {
        VStack {
            Text("Lokálne dáta: \(localData.value)")
            Button("Zmeniť lokálne dáta") {
                localData.value = "Zmenená lokálna hodnota \(Int.random(in: 1...100))"
            }
            
            // Odovzdávame localData do detského zobrazenia
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Sledujeme inštanciu DataModel, odovzdanú od rodiča
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Sledované dáta v dieťati: \(observedData.value)")
            Button("Zmeniť sledované dáta") {
                observedData.value = "Zmenené z dieťaťa \(Int.random(in: 1...100))"
            }
        }
    }
}