Sobes.tech
Middle

Mi az a state, state object és observed object az iOS fejlesztésben?

sobes.tech MI

Válasz az MI-től

A State egy SwiftUI-ben használt tulajdonságtok, amely lehetővé teszi a nézet helyi állapotának kezelését. Amikor a @State-tel becsomagolt tulajdonság értéke megváltozik, a nézet automatikusan frissül.

A StateObject egy SwiftUI tulajdonságbecsukás, amely az ObservableObject protokollt követő objektumok létrehozására és kezelésére szolgál, amelyek a nézet életciklusának részei. Hatékony olyan objektumok esetén, amelyeket a nézeten belül hozunk létre és együtt élnek vele.

Az ObservedObject egy SwiftUI tulajdonságbecsukás, amely meglévő ObservableObject típusú objektumokra való hivatkozások figyelésére szolgál, amelyeket kívülről adunk át. A SwiftUI figyeli ezekben az objektumokban bekövetkező változásokat, és frissíti a nézetet.

Összehasonlító táblázat:

Becsomagolás Cél Tulajdonlás Használati példa
@State Helyi állapot a nézetben Nézet Egyszerű számláló, láthatósági jelző
@StateObject ObservableObject létrehozása és tulajdonlás Nézet Nézetmodell (ViewModel), amelyet a nézet hoz létre
@ObservedObject Meglévő ObservableObject figyelése, amelyet Külső forrás Nézetmodell (ViewModel), amit szülő nézettől kapunk

A @State használatának példája:

struct CounterView: View {
    @State private var count: Int = 0 // Helyi állapot

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1 // Az állapot változása frissítést vált ki
            }
        }
    }
}

A @StateObject és @ObservedObject példái:

import SwiftUI

// ObservableObject a data modellhez
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Létrehozzuk és tulajdonoljuk a DataModel példányt
    @StateObject private var localData = DataModel(value: "Kezdeti helyi érték")

    var body: some View {
        VStack {
            Text("Helyi adatok: \(localData.value)")
            Button("Helyi adatok módosítása") {
                localData.value = "Módosított helyi érték \(Int.random(in: 1...100))"
            }
            
            // Átadjuk a localData-t a gyermek nézetnek
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Figyeljük a szülőtől kapott DataModel példányt
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Figyelt adatok a gyermekben: \(observedData.value)")
            Button("Figyelt adatok módosítása") {
                observedData.value = "Módosítva a gyermekből \(Int.random(in: 1...100))"
            }
        }
    }
}