Middle+
Назовите property wrapper-е који проглашавају семантику референце.
sobes.tech АИ
Одговор од АИ
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Ovi property wrapper-i ne objavlyavat semantiku 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@Statepromenliva 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@Stateili 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 protokolaObservableObject. Promyanata na@Publishedsvojstvata 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 instanciqObservableObjectvnutre 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 instanciiObservableObjectv 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) } }