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