Sobes.tech
Middle+

Uveďte property wrapper, ktorý deklaruje sémantiku odkazu.

sobes.tech AI

Odpoveď od AI

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

Tieto property wrapper-i ne deklarirat semantika na referencata vo tradicionalno razbiranje (kao pokazatel vo C++), no dozvoljavaat rabota so podatoci, predstaveni vo SwiftUI kato "referenci" ili obsht mutable iztochnici na istina. Tiy upravlyavat jivotniya cikŭl na podatocite i osiguravat avtomatichno obnovyavane na UI pri tyahnata promena.

Primeri:

  • @State: Upravlyava lokalnoto sostoyanie vnutre v View. Promyanata na @State promenliva vodi do prekarasvane na View.
    struct MyView: View {
        @State private var isActive = false
    
        var body: some View {
            Button("Toggle") {
                isActive.toggle()
            }
        }
    }
    
  • @Binding: Pozvoljava suzdavane na dvuposochna svŭrzka kum @State ili drug iztochnik na podatoci. Promenite na edno myasto se otrazqvat na drugoto.
    struct ParentView: View {
        @State private var value = 0
    
        var body: some View {
            VStack {
                Text("Value: \(value)")
                ChildView(count: $value) // $ suzdava Binding
            }
        }
    }
    
    struct ChildView: View {
        @Binding var count: Int // Poluchava Binding
    
        var body: some View {
            Button("Increment") {
                count += 1 // Promyana na Binding
            }
        }
    }
    
  • @ObservedObject: Izpolzva se za referentni tipove (klasove), koito implementirat protokola ObservableObject. Promyanata na @Published svojstvata v tozi obekt vodi do obnovyavane na View.
    import Combine
    
    class Counter: ObservableObject {
        @Published var count = 0
    }
    
    struct ContentView: View {
        @ObservedObject var counter = Counter() // Referenten tip
    
        var body: some View {
            VStack {
                Text("Count: \(counter.count)")
                Button("Increment") {
                    counter.count += 1
                }
            }
        }
    }
    
  • @StateObject: Podobno na @ObservedObject, no prednaznachen za suzdavane na instanciq ObservableObject vnutre v View i upravlenie na jivotniya mu cikŭl. View stava sobstvenik na obekta.
    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() // Suzdavane i sobstvenost na obekta
    
        var body: some View {
            Text("Time: \(timerData.timerSeconds)")
        }
    }
    
  • @EnvironmentObject: Pozvoljava da se passvat instancii ObservableObject v hierarhiyata na View, bez da se passvat chrez konstruktorite na vseki View.
    import Combine
    
    class UserSettings: ObservableObject {
        @Published var loggedIn = false
    }
    
    struct AppView: View {
        @StateObject var settings = UserSettings()
    
        var body: some View {
            ContentView()
                .environmentObject(settings) // Vkarvane v okolenieto
        }
    }
    
    struct ContentView: View {
        @EnvironmentObject var settings: UserSettings // Dostŭp ot okolenieto
    
        var body: some View {
            Toggle("Logged In", isOn: $settings.loggedIn)
        }
    }