Sobes.tech
Middle

Cosa sono state, oggetto di stato e oggetto osservato nello sviluppo iOS?

sobes.tech AI

Risposta dell'AI

State — è un wrapper di proprietà in SwiftUI che consente di gestire lo stato locale della vista. Quando il valore della proprietà avvolta in @State cambia, la vista si aggiorna automaticamente.

StateObject — è un wrapper di proprietà in SwiftUI per creare e gestire oggetti conformi al protocollo ObservableObject, che fanno parte del ciclo di vita della vista. È efficace per oggetti creati all'interno della vista e che vivono con essa.

ObservedObject — è un wrapper di proprietà in SwiftUI per gestire riferimenti a oggetti esistenti conformi al protocollo ObservableObject, passati dall'esterno. SwiftUI monitora le modifiche in questi oggetti e aggiorna la vista.

Tabella comparativa:

Wrapper Scopo Proprietà Esempio di utilizzo
@State Stato locale della vista La vista Contatore semplice, flag di visibilità
@StateObject Creazione e gestione di ObservableObject La vista Modello di vista (ViewModel) creato nella vista
@ObservedObject Monitoraggio di ObservableObject passato Fonte esterna Modello di vista (ViewModel) passato dal genitore

Esempio di utilizzo di @State:

struct CounterView: View {
    @State private var count: Int = 0 // Stato locale

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Incrementa") {
                count += 1 // La modifica dello stato provoca aggiornamento
            }
        }
    }
}

Esempio di utilizzo di @StateObject e @ObservedObject:

import SwiftUI

// ObservableObject per il modello di dati
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Creare e possedere un'istanza di DataModel
    @StateObject private var localData = DataModel(value: "Valore locale iniziale")

    var body: some View {
        VStack {
            Text("Dati locali: \(localData.value)")
            Button("Cambia dati locali") {
                localData.value = "Valore modificato localmente \(Int.random(in: 1...100))"
            }
            
            // Passare localData a una vista figlia
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Monitorare l'istanza di DataModel passata dal genitore
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Dati osservati nel bambino: \(observedData.value)")
            Button("Modifica dati osservati") {
                observedData.value = "Modificato dal bambino \(Int.random(in: 1...100))"
            }
        }
    }
}