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))"
}
}
}
}