Sobes.tech
Middle

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

sobes.tech AI

Odpověď od AI

State je obal vlastnosti ve SwiftUI, který umožňuje řídit místní stav zobrazení. Při změně hodnoty vlastnosti, která je zabalená v @State, se zobrazení automaticky aktualizuje.

StateObject je obal vlastnosti ve SwiftUI pro vytváření a správu objektů odpovídajících protokolu ObservableObject, které jsou součástí životního cyklu zobrazení. Je efektivní pro objekty, které jsou vytvořeny uvnitř zobrazení a s ním žijí.

ObservedObject je obal vlastnosti ve SwiftUI pro sledování odkazů na existující objekty odpovídající protokolu ObservableObject, které byly předány zvenčí. SwiftUI sleduje změny v těchto objektech a aktualizuje zobrazení.

Srovnávací tabulka:

Obal Účel Vlastnictví Příklad použití
@State Lokální stav zobrazení Zobrazení Jednoduchý čítač, příznak viditelnosti
@StateObject Vytváření a vlastnictví ObservableObject Zobrazení Model zobrazení (ViewModel), vytvořený v zobrazení
@ObservedObject Sledování ObservableObject, předaného Vnější zdroj Model zobrazení (ViewModel), předaný z rodičovského zobrazení

Příklad použití @State:

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

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1 // Změna stavu vyvolá aktualizaci
            }
        }
    }
}

Příklad použití @StateObject a @ObservedObject:

import SwiftUI

// ObservableObject pro model dat
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Vytváříme a vlastním instanci DataModel
    @StateObject private var localData = DataModel(value: "Počáteční místní hodnota")

    var body: some View {
        VStack {
            Text("Místní data: \(localData.value)")
            Button("Změnit místní data") {
                localData.value = "Změněná místní hodnota \(Int.random(in: 1...100))"
            }
            
            // Předáváme localData do dětského zobrazení
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Sledujeme instanci DataModel předanou z rodiče
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Sledovaná data v dítěti: \(observedData.value)")
            Button("Změnit sledovaná data") {
                observedData.value = "Změněno z dítěte \(Int.random(in: 1...100))"
            }
        }
    }
}