Sobes.tech
Junior

Τι σημαίνει αν οριστεί ένας setter για μια μεταβλητή;

sobes.tech AI

Απάντηση από AI

Ένας setter (οριστής) είναι μια μέθοδος που επιτρέπει τον έλεγχο της εγγραφής μιας νέας τιμής σε μια μεταβλητή. Κατά τον ορισμό ενός setter, ο τυπικός μηχανισμός ανάθεσης τιμής αντικαθίσταται από κώδικα μέσα στον setter. Αυτό δίνει τη δυνατότητα:

  • Επικύρωση των εισερχόμενων δεδομένων: Έλεγχος αν η νέα τιμή πληροί τις καθορισμένες προϋποθέσεις πριν την αναθέσετε στη μεταβλητή.
    var age: Int = 0 {
        didSet { // Το didSet (μετά την ανάθεση) καλείται μετά την ανάθεση
            if age < 0 {
                age = 0 // Δεν επιτρέπουμε αρνητικές τιμές
            }
        }
    }
    
  • Εκτέλεση πρόσθετων ενεργειών: Εκτέλεση άλλου κώδικα όταν αλλάζει η τιμή της μεταβλητής, π.χ., ενημέρωση του χρήστη ή ειδοποίηση άλλων τμημάτων της εφαρμογής.
    var score: Int = 0 {
        didSet { // Το didSet
            print("Ενημερώθηκε το σκορ σε \(score)") // Καταγραφή της αλλαγής
            updateUI() // Ενημέρωση του UI
        }
    }
    
    func updateUI() {
        // Κώδικας για ενημέρωση του περιβάλλοντος χρήστη
    }
    
  • Υπολογισμός τιμών άλλων ιδιοτήτων: Η αλλαγή μιας ιδιότητας μπορεί να επηρεάσει την τιμή μιας άλλης.
    var radius: Double = 0.0 {
        didSet { // Το didSet
            area = Double.pi * radius * radius // Υπολογισμός εκ νέου της επιφάνειας
        }
    }
    
    var area: Double = 0.0 // Ιδιοιότητα που εξαρτάται από το radius
    

Οι setter στη Swift μπορούν να χρησιμοποιηθούν για αποθηκευμένες και υπολογιζόμενες ιδιότητες. Για αποθηκευμένες ιδιότητες, συχνά χρησιμοποιούνται παρατηρητές ιδιοτήτων (willSet και didSet), που καλούνται πριν και μετά την ανάθεση νέας τιμής, αντίστοιχα. Για υπολογιζόμενες ιδιότητες, ο setter (set) ορίζει πώς πρέπει να ανατεθεί η τιμή.

var myProperty: String {
    // Getter
    get {
        return "Η τιμή είναι: \(internalValue)"
    }
    // Setter
    set(newValue) {
        internalValue = newValue + " επεξεργασμένο" // Τροποποίηση της ανατεθειμένης τιμής
    }
}

private var internalValue: String = "" // Εσωτερική αποθηκευμένη ιδιότητα