willSet και didSet είναι παρατηρητές ιδιοτήτων (property observers) στη Swift που επιτρέπουν την εκτέλεση κώδικα πριν και μετά την αλλαγή της τιμής μιας ιδιότητας. Σε αντίθεση με τα computed properties, οι παρατηρητές δεν υπολογίζουν μια νέα τιμή, αλλά αντιδρούν μόνο στην αλλαγή. Σύμφωνα με την τεκμηρίωση της Apple, The Swift Programming Language (2026), οι παρατηρητές είναι απαραίτητοι για την επικύρωση δεδομένων, τον συγχρονισμό διεπαφής και την καταγραφή αλλαγών στον κώδικα.
Κύρια σημεία
willSet και didSet είναι property observers (παρατηρητές ιδιότητας) στη Swift, ένας ενσωματωμένος μηχανισμός παρακολούθησης αλλαγών stored properties.
Σε αντίθεση με άλλες γλώσσες όπου απαιτείται χειροκίνητη υλοποίηση setters ή συστημάτων callback, η Swift παρέχει δηλωτική σύνταξη για αντίδραση σε αλλαγές. Οι παρατηρητές προστίθενται αμέσως μετά τη δήλωση της ιδιότητας και δεν απαιτούν ξεχωριστή κλήση.
Σύμφωνα με το Apple Developer Documentation (2026), οι property observers υποστηρίζονται για stored properties οποιασδήποτε κλάσης, δομής ή απαρίθμησης. Δεν λειτουργούν με computed properties, καθώς αυτά δεν αποθηκεύουν τιμή — γι' αυτά η αντίδραση στην αλλαγή υλοποιείται απευθείας στον setter.
willSet καλείται αμέσως πριν από την ανάθεση της νέας τιμής στην ιδιότητα. Μέσα στο willSet είναι διαθέσιμη η σιωπηρή παράμετρος newValue, που περιέχει την τιμή που θα οριστεί. Αυτή τη στιγμή η τρέχουσα τιμή της ιδιότητας δεν έχει αλλάξει ακόμα — μπορείτε να διαβάσετε την παλιά τιμή απευθείας μέσω της ιδιότητας.
Σύμφωνα με το Swift Evolution proposal SE-0001 (2024), το willSet παρέχει τη δυνατότητα διεξαγωγής επικύρωσης ή καταγραφής πριν από την πραγματική αλλαγή. Αν στο willSet εκτιναχθεί μια εξαίρεση — η νέα τιμή δεν θα εφαρμοστεί, καθιστώντας τους παρατηρητές μηχανισμό προστασίας δεδομένων.
didSet καλείται αμέσως μετά την ανάθεση της νέας τιμής. Μέσα στο didSet είναι διαθέσιμη η σιωπηρή παράμετρος oldValue, που περιέχει την τιμή πριν από την αλλαγή. Αυτή τη στιγμή η ιδιότητα περιέχει ήδη τη νέα τιμή και μπορείτε να τη συγκρίνετε με την παλιά.
Σύμφωνα με το Swift by Sundell (2025), το didSet είναι ο πιο δημοφιλής παρατηρητής, καθώς χρειάζεται συχνότερα για μετα-επεξεργασία: ενημέρωση UI, επανυπολογισμό εξαρτημένων πεδίων ή αποστολή δεδομένων στον διακομιστή μετά από αλλαγή.
Οι property observers δηλώνονται αμέσως μετά την ιδιότητα χρησιμοποιώντας άγκιστρα. Η ελάχιστη σύνταξη απαιτεί μόνο έναν παρατηρητή, αλλά μπορούν να δηλωθούν και οι δύο.
var score: Int = 0 {
willSet {
print("Το σκορ θα αλλάξει σε \(newValue)")
}
didSet {
print("Το σκορ άλλαξε από \(oldValue) σε \(score)")
}
}
Και οι δύο παρατηρητές είναι προαιρετικοί — μπορείτε να καθορίσετε μόνο willSet ή μόνο didSet. Για το willSet, το newValue μπορεί να μετονομαστεί καθορίζοντας το όνομα σε παρένθεση.
var username: String = "guest" {
willSet(newName) {
print("Πρόκειται να ορίσει \(newName)")
}
didSet(oldName) {
print("Ήταν \(oldName), τώρα \(username)")
}
}
Σύμφωνα με το Swift Language Guide (2026), η μετονομασία παραμέτρων βελτιώνει την αναγνωσιμότητα του κώδικα, ειδικά όταν η ιδιότητα και οι παρατηρητές χρησιμοποιούνται σε ένα μεγάλο έργο με μεγάλα ονόματα.
Η σειρά εκτέλεσης είναι αυστηρά καθορισμένη: πρώτα willSet (η παλιά τιμή είναι διαθέσιμη), στη συνέχεια ανάθεση, έπειτα didSet (η νέα τιμή είναι διαθέσιμη).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("Η θερμοκρασία θα αλλάξει από \(celsius) σε \(newValue)")
}
didSet {
if celsius > 100.0 {
print("Το σημείο βρασμού ξεπεράστηκε!")
}
}
}
}
Σημαντικός περιορισμός: οι παρατηρητές δεν καλούνται κατά την αρχικοποίηση της ιδιότητας στη διαδικασία δημιουργίας στιγμιότυπου. Εντός του init, η ανάθεση τιμής δεν πυροδοτεί τα willSet και didSet — αυτό αποτρέπει ανεπιθύμητες παρενέργειες στο στάδιο της κατασκευής.
Σύμφωνα με το Apple Swift Blog (2025), αυτή η συμπεριφορά διαφέρει από πολλές άλλες γλώσσες όπου οι setters καλούνται ακόμη και σε κατασκευαστές. Η Swift επιλέγει την ασφάλεια: οι παρατηρητές αρχίζουν να λειτουργούν μόνο μετά την ολοκλήρωση της αρχικοποίησης του αντικειμένου.
Η αλλαγή ιδιότητας μέσα στο didSet μπορεί να οδηγήσει σε επαναλαμβανόμενη κλήση των παρατηρητών. Η Swift δεν μπλοκάρει την αναδρομή — ο προγραμματιστής πρέπει να την ελέγχει ο ίδιος.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Αυτός ο κώδικας θα δημιουργήσει πλήρη αναδρομή με υπερχείλιση στοίβας, αν δεν προβλέπεται συνθήκη εξόδου. Σύμφωνα με το Stack Overflow Swift Community (2025), αυτό είναι ένα από τα συνηθέστερα λάθη αρχάριων προγραμματιστών κατά την εργασία με property observers.
Οι δομές υποστηρίζουν willSet και didSet για stored properties χωρίς περιορισμούς. Είναι σημαντικό να θυμάστε ότι οι δομές είναι value types, και η τροποποίηση ιδιότητας εντός μιας mutating μεθόδου πυροδοτεί επίσης τους παρατηρητές.
struct Point {
var x: Double = 0.0 {
didSet {
print("Το X άλλαξε σε \(x)")
}
}
var y: Double = 0.0 {
didSet {
print("Το Y άλλαξε σε \(y)")
}
}
}
var point = Point()
point.x = 5.0
Οι παρατηρητές ιδιότητας χρησιμοποιούνται σε έργα Swift για ένα ευρύ φάσμα εργασιών: από συγχρονισμό UI έως επικύρωση δεδομένων και καταγραφή.
didSet επιτρέπει την αναίρεση ή διόρθωση μιας μη έγκυρης τιμής αμέσως μετά τον ορισμό της. Αυτό αντικαθιστά τους ογκώδεις setters στην Objective-C και εξασφαλίζει την ακεραιότητα δεδομένων σε επίπεδο μοντέλου.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
Κατά την αλλαγή μιας σχετικής ιδιότητας, τα στοιχεία διεπαφής μπορούν να ενημερώνονται αυτόματα χωρίς ξεχωριστή κλήση μεθόδου ενημέρωσης.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet είναι βολικό για καταγραφή με σκοπό τον εντοπισμό σφαλμάτων ή τον έλεγχο. Μπορείτε να καταγράψετε τον χρόνο και τη νέα τιμή πριν από την εφαρμογή της, διασφαλίζοντας ότι το αρχείο καταγραφής περιέχει τα αρχικά δεδομένα για ανάλυση.
Σύμφωνα με το objc.io (2025), οι property observers είναι ιδιαίτερα χρήσιμοι σε αρχιτεκτονικές με μονόδρομη ροή δεδομένων, όπου κάθε αλλαγή ιδιότητας καταγράφεται για μεταγενέστερη αναπαραγωγή της κατάστασης.
Τα computed properties υπολογίζουν την τιμή επί τόπου και δεν έχουν αποθηκευτικό χώρο, ενώ τα willSet και didSet λειτουργούν σε stored property με πραγματική τιμή.
| Χαρακτηριστικό | Property Observers | Computed Properties |
|---|---|---|
| Αποθηκεύει τιμή | Ναι | Όχι |
| Εκτελεί κώδικα κατά την αλλαγή | Ναι | Όχι |
| Τύπος δήλωσης | var | var (get/set) |
| Παράμετροι πρόσβασης | newValue, oldValue | newValue (στο set) |
| Αρχικοποίηση | Απαιτεί αρχική τιμή | Δεν απαιτείται |
Η βασική διαφορά: το computed property υπολογίζει την τιμή σε κάθε πρόσβαση, ενώ ο property observer αντιδρά στην αλλαγή μιας υπάρχουσας τιμής. Η επιλογή μεταξύ τους υπαγορεύεται από τη σημασιολογία — αν η ιδιότητα είναι παράγωγο άλλων δεδομένων, χρησιμοποιήστε computed· αν είναι μια ανεξάρτητη τιμή της οποίας οι αλλαγές πρέπει να παρατηρούνται, χρησιμοποιήστε willSet/didSet.
Το συνηθέστερο λάθος — αναδρομική κλήση του didSet χωρίς συνθήκη εξόδου. Κάθε αλλαγή ιδιότητας μέσα στο didSet πυροδοτεί ξανά τον observer, οδηγώντας σε ατέρμονο βρόχο.
Το δεύτερο συνηθισμένο λάθος — προσπάθεια χρήσης παρατηρητών σε let ιδιότητες. Ο μεταγλωττιστής Swift θα δώσει σφάλμα, καθώς το let είναι σταθερά.
Το τρίτο λάθος — αγνόηση του γεγονότος ότι ο observer δεν καλείται κατά την αρχικοποίηση. Οι προγραμματιστές που περιμένουν ενεργοποίηση του willSet εντός του init αντιμετωπίζουν απροσδόκητη συμπεριφορά.
Το τέταρτο πρόβλημα — εφαρμογή παρατηρητών σε ιδιότητες σε extension. Η Swift απαγορεύει την προσθήκη willSet/didSet σε stored properties σε extension.
Σύμφωνα με το Ray Wenderlich (2025), η κατανόηση αυτών των περιορισμών βοηθά στην αποφυγή σφαλμάτων στα πρώτα στάδια και καθιστά τον κώδικα σε Swift πιο προβλέψιμο.
Συχνές Ερωτήσεις
Ναι, κάθε παρατηρητής είναι προαιρετικός. Μπορείτε να δηλώσετε μόνο willSet, μόνο didSet ή και τα δύο ταυτόχρονα.
Όχι, η Swift απαγορεύει την προσθήκη willSet και didSet σε extension για stored properties. Οι παρατηρητές δηλώνονται μόνο στον αρχικό ορισμό του τύπου.
Όχι, κατά την αρχικοποίηση οι παρατηρητές δεν καλούνται. Αυτός είναι ένας προστατευτικός μηχανισμός που αποτρέπει παρενέργειες στο στάδιο κατασκευής του αντικειμένου.
willSet είναι ένας παρατηρητής stored property που εκτελείται πριν από την αλλαγή τιμής. Ο setter σε computed property είναι ένας τρόπος υπολογισμού μιας νέας τιμής, όχι παρατήρησης μιας υπάρχουσας.
Η επαναλαμβανόμενη κλήση του didSet θα προκαλέσει αναδρομή. Χωρίς συνθήκη εξόδου, αυτό θα οδηγήσει σε υπερχείλιση στοίβας και μη φυσιολογικό τερματισμό του προγράμματος.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης