Middle+
Անվանեք այն property wrapper-ները, որոնք հայտարարում են հղման սեմանտիկան։
sobes.tech AI
Պատասխան AI-ից
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Այս property wrapper-ները չեն հայտարարում հղման սիմանթիկային ավանդական իմաստով (ինչպես C++-ում ցուցիչը), բայց թույլ են տալիս աշխատել տվյալների հետ, որոնք ներկայացված են SwiftUI-ում որպես "հղումներ" կամ ընդհանուր mutable աղբյուրներ ճշմարտության։ Նրանք կառավարում տվյալների կյանքի ցիկլը և ապահովում ավտոմատ UI թարմացումներ նրանց փոփոխության ժամանակ:
Օրինակներ՝
@State: Կառավարում է View-ի ներսի տեղական վիճակը։@Stateփոփոխականի փոփոխությունը հանգեցնում է View-ի վերաարտադրման:struct MyView: View { @State private var isActive = false var body: some View { Button("Toggle") { isActive.toggle() } } }@Binding: Позволяет создать двустороннюю привязку к@Stateили другому источнику данных։ Изменения в одном месте отражаются в другом:struct ParentView: View { @State private var value = 0 var body: some View { VStack { Text("Value: \(value)") ChildView(count: $value) // $ создает Binding } } } struct ChildView: View { @Binding var count: Int // Получаем Binding var body: some View { Button("Increment") { count += 1 // Изменение Binding } } }@ObservedObject: Используется для ссылочных типов (классов), реализующих протоколObservableObject. Изменение@Publishedсвойств этого объекта вызывает обновление View:import Combine class Counter: ObservableObject { @Published var count = 0 } struct ContentView: View { @ObservedObject var counter = Counter() // Ссылочный тип var body: some View { VStack { Text("Count: \(counter.count)") Button("Increment") { counter.count += 1 } } } }@StateObject: Պես նման է@ObservedObject, բայց նախատեսված էObservableObjectօբյեկտի օրինակ ստեղծելու և նրա կյանքի ցիկլը կառավարելու համար։ View-ը դառնում է օբյեկտի սեփականատերը: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() // Օբյեկտի ստեղծում և սեփականություն var body: some View { Text("Time: \(timerData.timerSeconds)") } }@EnvironmentObject: Позволяет передавать экземплярыObservableObjectв иерархии View, не передавая их через конструкторы каждого View:import Combine class UserSettings: ObservableObject { @Published var loggedIn = false } struct AppView: View { @StateObject var settings = UserSettings() var body: some View { ContentView() .environmentObject(settings) // Внедрение в окружение } } struct ContentView: View { @EnvironmentObject var settings: UserSettings // Доступ из окружения var body: some View { Toggle("Logged In", isOn: $settings.loggedIn) } }