Sobes.tech
Middle

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