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, αλλά προορίζεται για τη δημιουργία ενός instance ObservableObject εντός του View και τη διαχείριση του κύκλου ζωής του. Το 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: Επιτρέπει την μεταβίβαση instances 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)
        }
    }