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@Stateprovoca 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@Stateou 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 protocoloObservableObject. A alteração de propriedades marcadas com@Publishedneste 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 deObservableObjectdentro 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 deObservableObjectna 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) } }