¿Qué es el estado, el objeto de estado y el objeto observado en el desarrollo de iOS?
sobes.tech AI
Respuesta de la IA
State — es una envoltura de propiedad en SwiftUI que permite gestionar el estado local de la vista. Cuando cambia el valor de la propiedad envuelta en @State, la vista se actualiza automáticamente.
StateObject — es una envoltura de propiedad en SwiftUI para crear y gestionar objetos que cumplen con el protocolo ObservableObject, los cuales forman parte del ciclo de vida de la vista. Es eficiente para objetos creados dentro de la vista y que viven con ella.
ObservedObject — es una envoltura de propiedad en SwiftUI para gestionar referencias a objetos existentes que cumplen con el protocolo ObservableObject, los cuales han sido pasados desde afuera. SwiftUI supervisa los cambios en estos objetos y actualiza la vista.
Tabla comparativa:
| Envoltura | Propósito | Propiedad | Ejemplo de uso |
|---|---|---|---|
@State |
Estado local de la vista | La vista | Contador simple, bandera de visibilidad |
@StateObject |
Creación y propiedad de ObservableObject |
La vista | Modelo de vista (ViewModel) creado en la vista |
@ObservedObject |
Supervisión de ObservableObject pasado |
Fuente externa | Modelo de vista (ViewModel) pasado desde un padre |
Ejemplo de uso de @State:
struct CounterView: View {
@State private var count: Int = 0 // Estado local
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Cambiar el estado provoca actualización
}
}
}
}
Ejemplo de uso de @StateObject y @ObservedObject:
import SwiftUI
// ObservableObject para el modelo de datos
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Crear y poseer una instancia de DataModel
@StateObject private var localData = DataModel(value: "Valor inicial local")
var body: some View {
VStack {
Text("Datos locales: \(localData.value)")
Button("Cambiar datos locales") {
localData.value = "Valor cambiado localmente \(Int.random(in: 1...100))"
}
// Pasar localData a una vista hija
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Supervisar la instancia de DataModel pasada desde el padre
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Datos observados en hijo: \(observedData.value)")
Button("Cambiar datos observados") {
observedData.value = "Cambiado desde hijo \(Int.random(in: 1...100))"
}
}
}
}