Sobes.tech
Middle

Ce sunt state, obiectul de stare și obiectul observat în dezvoltarea iOS?

sobes.tech AI

Răspuns de la AI

State — este un wrapper de proprietate în SwiftUI care permite gestionarea stării locale a vizualizării. Când valoarea proprietății învelite în @State se schimbă, vizualizarea se actualizează automat.

StateObject — este un wrapper de proprietate în SwiftUI pentru crearea și gestionarea obiectelor care respectă protocolul ObservableObject, care fac parte din ciclul de viață al vizualizării. Eficient pentru obiecte create în interiorul vizualizării și care trăiesc împreună cu ea.

ObservedObject — este un wrapper de proprietate în SwiftUI pentru gestionarea referințelor către obiecte existente care respectă protocolul ObservableObject, și care au fost transmise din exterior. SwiftUI monitorizează modificările acestor obiecte și actualizează vizualizarea.

Tabel comparativ:

Wrapper Scop Proprietate Exemplu de utilizare
@State Stare locală a vizualizării Vizualizarea Contor simplu, flag de vizibilitate
@StateObject Crearea și gestionarea ObservableObject Vizualizarea Model de vizualizare (ViewModel) creat în vizualizare
@ObservedObject Monitorizarea unui ObservableObject transmis Sursa externă Model de vizualizare (ViewModel) transmis de la părinte

Exemplu de utilizare @State:

struct CounterView: View {
    @State private var count: Int = 0 // Stare locală

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1 // Modificarea stării declanșează actualizarea
            }
        }
    }
}

Exemplu de utilizare @StateObject și @ObservedObject:

import SwiftUI

// ObservableObject pentru modelul de date
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Crează și deține o instanță de DataModel
    @StateObject private var localData = DataModel(value: "Valoare inițială locală")

    var body: some View {
        VStack {
            Text("Date locale: \(localData.value)")
            Button("Schimbă datele locale") {
                localData.value = "Valoare schimbată local \(Int.random(in: 1...100))"
            }
            
            // Transmite localData către o vizualizare copil
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Monitorizează instanța de DataModel transmisă din părinte
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Date observate în copil: \(observedData.value)")
            Button("Schimbă datele observate") {
                observedData.value = "Schimbat din copil \(Int.random(in: 1...100))"
            }
        }
    }
}