Sobes.tech
Middle

O que é estado, objeto de estado e objeto observado no desenvolvimento iOS?

sobes.tech IA

Resposta da IA

State — é um envoltório de propriedade no SwiftUI que permite gerir o estado local da vista. Quando o valor da propriedade envolvida em @State muda, a vista atualiza-se automaticamente.

StateObject — é um envoltório de propriedade no SwiftUI para criar e gerir objetos que cumprem o protocolo ObservableObject, que fazem parte do ciclo de vida da vista. É eficiente para objetos criados dentro da vista e que vivem com ela.

ObservedObject — é um envoltório de propriedade no SwiftUI para gerir referências a objetos existentes que cumprem o protocolo ObservableObject, que foram passados de fora. O SwiftUI observa as mudanças nesses objetos e atualiza a vista.

Tabela comparativa:

Envoltório Propósito Propriedade Exemplo de uso
@State Estado local da vista A vista Contador simples, flag de visibilidade
@StateObject Criação e gestão de ObservableObject A vista Modelo de vista (ViewModel) criado na vista
@ObservedObject Supervisão de ObservableObject passado Fonte externa Modelo de vista (ViewModel) passado de um pai

Exemplo de uso de @State:

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

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Incrementar") {
                count += 1 // Alterar o estado provoca atualização
            }
        }
    }
}

Exemplo de uso de @StateObject e @ObservedObject:

import SwiftUI

// ObservableObject para o modelo de dados
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Criar e possuir uma instância de DataModel
    @StateObject private var localData = DataModel(value: "Valor inicial local")

    var body: some View {
        VStack {
            Text("Dados locais: \(localData.value)")
            Button("Alterar dados locais") {
                localData.value = "Valor alterado localmente \(Int.random(in: 1...100))"
            }
            
            // Passar localData para uma vista filha
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Supervisar a instância de DataModel passada do pai
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Dados observados na criança: \(observedData.value)")
            Button("Alterar dados observados") {
                observedData.value = "Alterado a partir da criança \(Int.random(in: 1...100))"
            }
        }
    }
}