Middle+
Numiți wrapper-ul de proprietate care declară semantica referinței.
sobes.tech AI
Răspuns de la AI
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Acești wrapperi de proprietate nu declară semantica de referință în sensul tradițional (ca un pointer în C++), dar permit lucrul cu date prezentate în SwiftUI ca "referințe" sau surse comune mutabile de adevăr. Ei gestionează ciclul de viață al datelor și asigură actualizarea automată a UI-ului la modificarea acestora.
De exemplu:
@State: Gestionează starea locală în interiorul unei Vederi. Modificarea variabilei@Stateduce la re-renderizarea Vederii.struct MyView: View { @State private var isActive = false var body: some View { Button("Toggle") { isActive.toggle() } } }@Binding: Permite crearea unei legături bidirecționale către@Statesau altă sursă de date. Modificările într-un loc se reflectă în celălalt.struct ParentView: View { @State private var value = 0 var body: some View { VStack { Text("Value: \(value)") ChildView(count: $value) // $ creează un Binding } } } struct ChildView: View { @Binding var count: Int // Obținem un Binding var body: some View { Button("Increment") { count += 1 // Modificare Binding } } }@ObservedObject: Este folosit pentru tipuri referențiale (clase) care implementează protocolulObservableObject. Modificarea proprietăților marcate cu@Publishedîn acest obiect declanșează actualizarea Vederii.import Combine class Counter: ObservableObject { @Published var count = 0 } struct ContentView: View { @ObservedObject var counter = Counter() // Tip referențial var body: some View { VStack { Text("Count: \(counter.count)") Button("Increment") { counter.count += 1 } } } }@StateObject: Similar cu@ObservedObject, dar destinat creării unei instanțe deObservableObjectîn interiorul Vederii și gestionării ciclului său de viață. Vederea devine proprietarul obiectului.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() // Crearea și deținerea obiectului var body: some View { Text("Time: \(timerData.timerSeconds)") } }@EnvironmentObject: Permite transmiterea instanțelor deObservableObjectîn ierarhia Vederilor, fără a le transmite prin constructorii fiecărei Vederi.import Combine class UserSettings: ObservableObject { @Published var loggedIn = false } struct AppView: View { @StateObject var settings = UserSettings() var body: some View { ContentView() .environmentObject(settings) // Injectare în mediu } } struct ContentView: View { @EnvironmentObject var settings: UserSettings // Acces din mediu var body: some View { Toggle("Logged In", isOn: $settings.loggedIn) } }