Sobes.tech
Middle+

İstinadın semantikası elan edən property wrapper-ı adlandırın.

sobes.tech Süni İntellekt

AI-dan cavab

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

Bu property wrapper'lar ənənəvi anlamda (C++-də göstərici kimi) referans semantikası elan etmir, lakin SwiftUI-də "referanslar" və ya ümumi mutable həqiqət mənbələri kimi təqdim olunan məlumatlarla işləməyə imkan verir. Onlar məlumatların həyat dövrünü idarə edir və dəyişiklikləri zamanı UI-nin avtomatik yenilənməsini təmin edir.

Məsələn:

  • @State: View daxilində lokal vəziyyəti idarə edir. @State dəyişəninin dəyişməsi View-in yenidən çəkilməsinə səbəb olur.
    struct MyView: View {
        @State private var isActive = false
    
        var body: some View {
            Button("Toggle") {
                isActive.toggle()
            }
        }
    }
    
  • @Binding: @State və ya digər məlumat mənbəyinə iki tərəfli bağlama yaratmağa imkan verir. Dəyişikliklər bir yerdə digərinə əks olunur.
    struct ParentView: View {
        @State private var value = 0
    
        var body: some View {
            VStack {
                Text("Value: \(value)")
                ChildView(count: $value) // $ bağlama yaradır
            }
        }
    }
    
    struct ChildView: View {
        @Binding var count: Int // Bağlamanı alır
    
        var body: some View {
            Button("Increment") {
                count += 1 // Bağlamanı dəyişir
            }
        }
    }
    
  • @ObservedObject: ObservableObject protokolunu həyata keçirən referans tipləri üçün istifadə olunur. Bu obyektin @Published ilə işarələnmiş xüsusiyyətlərində dəyişikliklər View-in yenilənməsinə səbəb olur.
    import Combine
    
    class Counter: ObservableObject {
        @Published var count = 0
    }
    
    struct ContentView: View {
        @ObservedObject var counter = Counter() // Referans tipi
    
        var body: some View {
            VStack {
                Text("Count: \(counter.count)")
                Button("Increment") {
                    counter.count += 1
                }
            }
        }
    }
    
  • @StateObject: @ObservedObject-ə bənzəyir, lakin ObservableObject nümunəsini View daxilində yaratmaq və onun həyat dövrünü idarə etmək üçün nəzərdə tutulub. View obyektin sahibi olur.
    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() // Yaratma və sahibi olma
    
        var body: some View {
            Text("Time: \(timerData.timerSeconds)")
        }
    }
    
  • @EnvironmentObject: ObservableObject nümunələrini View-lərin hiyerarşisində keçirməyə imkan verir, onları hər View-un konstruktoru vasitəsilə ötürmədən.
    import Combine
    
    class UserSettings: ObservableObject {
        @Published var loggedIn = false
    }
    
    struct AppView: View {
        @StateObject var settings = UserSettings()
    
        var body: some View {
            ContentView()
                .environmentObject(settings) // Ətraf mühitə daxil edilir
        }
    }
    
    struct ContentView: View {
        @EnvironmentObject var settings: UserSettings // Ətraf mühitdən əldə edilir
    
        var body: some View {
            Toggle("Logged In", isOn: $settings.loggedIn)
        }
    }