Sobes.tech
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 @State duce 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 @State sau 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ă protocolul ObservableObject. 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 de ObservableObject î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 de ObservableObject î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)
        }
    }