Sobes.tech
Middle+

Nomeie o wrapper de propriedade que declara a semântica da referência.

sobes.tech IA

Resposta da IA

  • @State
  • @Binding
  • @EnvironmentObject
  • @ObservedObject
  • @StateObject

Estes wrappers de propriedade não declaram a semântica de referência no sentido tradicional (como um ponteiro em C++), mas permitem trabalhar com dados apresentados no SwiftUI como "referências" ou fontes mutáveis partilhadas de verdade. Gerenciam o ciclo de vida dos dados e garantem a atualização automática da interface de utilizador quando estes mudam.

Por exemplo:

  • @State: Gerencia o estado local dentro de uma View. Alterar a variável @State provoca a re-renderização da View.
    struct MyView: View {
        @State private var isActive = false
    
        var body: some View {
            Button("Toggle") {
                isActive.toggle()
            }
        }
    }
    
  • @Binding: Permite criar uma ligação bidirecional a @State ou a outra fonte de dados. As alterações num local refletem-se no outro.
    struct ParentView: View {
        @State private var value = 0
    
        var body: some View {
            VStack {
                Text("Value: \(value)")
                ChildView(count: $value) // $ cria um Binding
            }
        }
    }
    
    struct ChildView: View {
        @Binding var count: Int // Obtemos um Binding
    
        var body: some View {
            Button("Increment") {
                count += 1 // Alteração do Binding
            }
        }
    }
    
  • @ObservedObject: Usado para tipos de referência (classes) que implementam o protocolo ObservableObject. A alteração de propriedades marcadas com @Published neste objeto provoca a atualização da View.
    import Combine
    
    class Counter: ObservableObject {
        @Published var count = 0
    }
    
    struct ContentView: View {
        @ObservedObject var counter = Counter() // Tipo de referência
    
        var body: some View {
            VStack {
                Text("Count: \(counter.count)")
                Button("Increment") {
                    counter.count += 1
                }
            }
        }
    }
    
  • @StateObject: Semelhante a @ObservedObject, mas destinado a criar uma instância de ObservableObject dentro da View e gerenciar o seu ciclo de vida. A View torna-se proprietária do objeto.
    import Combine
    
    class TimerData: ObservableObject {
        @Published var timerSeconds = 0
    
        init() {
            Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
                self.timerSeconds += 1
            }
        }
    }
    
    struct TimerView: View {
        @StateObject var timerData = TimerData() // Criação e propriedade do objeto
    
        var body: some View {
            Text("Time: \(timerData.timerSeconds)")
        }
    }
    
  • @EnvironmentObject: Permite passar instâncias de ObservableObject na hierarquia de Views, sem passá-las através dos inicializadores de cada View.
    import Combine
    
    class UserSettings: ObservableObject {
        @Published var loggedIn = false
    }
    
    struct AppView: View {
        @StateObject var settings = UserSettings()
    
        var body: some View {
            ContentView()
                .environmentObject(settings) // Injeção no ambiente
        }
    }
    
    struct ContentView: View {
        @EnvironmentObject var settings: UserSettings // Acesso a partir do ambiente
    
        var body: some View {
            Toggle("Logged In", isOn: $settings.loggedIn)
        }
    }