Sobes.tech
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)
        }
    }