Associated Values — μηχανισμός της Swift που επιτρέπει την επισύναψη αυθαίρετων δεδομένων σε κάθε παραλλαγή enum ξεχωριστά. Σε αντίθεση με τα raw values, όπου όλα τα case έχουν τιμές του ίδιου τύπου, τα associated values μπορεί να διαφέρουν ως προς τον τύπο και την ποσότητα για κάθε case. Σύμφωνα με το Apple Documentation, 2026, αυτή είναι μια βασική δυνατότητα για ακριβή μοντελοποίηση τομέα χωρίς δημιουργία πρόσθετων τύπων περιτυλίγματος.
Κύρια σημεία
Associated Values — είναι πρόσθετες πληροφορίες που ένα case enum μπορεί να αποθηκεύσει μαζί του. Σε αντίθεση με τα raw values, τα οποία είναι σταθερά σε επίπεδο δήλωσης, τα associated values καθορίζονται κατά τη δημιουργία παρουσίας enum.
Φανταστείτε τη μοντελοποίηση μιας μεθόδου πληρωμής: το case creditCard μπορεί να αποθηκεύσει τα τελευταία 4 ψηφία και την ημερομηνία λήξης, και το case applePay — τίποτα. Με associated values αυτό υλοποιείται φυσικά, χωρίς υποκλάσεις ή προαιρετικά πεδία.
Σύμφωνα με την τεκμηρίωση της Apple, τα associated values μετατρέπουν το enum από ένα απλό σύνολο σταθερών σε έναν αλγεβρικό τύπο δεδομένων (sum type), χαρακτηριστικό των λειτουργικών γλωσσών. Αυτό αυξάνει σημαντικά την εκφραστικότητα του κώδικα.
Associated values δηλώνονται σε παρενθέσεις μετά το case, με αναφορά ονομάτων και τύπων παραμέτρων, όπως σε συναρτήσεις.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Κατά τη δημιουργία παρουσίας, τα associated values μεταβιβάζονται ως ορίσματα:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Η Swift δεν επιβάλλει περιορισμούς στον αριθμό ή τους τύπους associated values. Μπορείτε να χρησιμοποιήσετε generics, συναρτήσεις κλεισίματος και άλλα enum μέσα σε associated values. Αυτό καθιστά δυνατή την κατασκευή περίπλοκων ένθετων δομών.
Τα ονόματα παραμέτρων associated values χρησιμοποιούνται ως ετικέτες ορισμάτων κατά τη δημιουργία παρουσίας — αυτό βελτιώνει την αναγνωσιμότητα του κώδικα. Κατά την εξαγωγή μέσω switch, τα ονόματα χρησιμεύουν ως τεκμηρίωση, εξηγώντας την έννοια κάθε τιμής. Αυτή η προσέγγιση καθιστά τον κώδικα αυτο-τεκμηριωμένο και μειώνει την πιθανότητα σφαλμάτων κατά την αντιστοίχιση δεδομένων. Αυτό είναι ιδιαίτερα πολύτιμο στην ομαδική ανάπτυξη μεγάλων εφαρμογών iOS.
Switch — ο κύριος τρόπος εξαγωγής associated values. Οι τιμές δεσμεύονται σε σταθερές ή μεταβλητές μέσω let ή var.
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Η Swift υποστηρίζει μερική αντιστοίχιση — μπορούν να καθοριστούν συγκεκριμένες τιμές associated values:
switch file {
case .image(let w, let h, "png"):
print("Εικόνα PNG \(w)x\(h)")
case .image(1920, 1080, _):
print("Εικόνα Full HD")
default:
break
}
Η χρήση wildcard (_) επιτρέπει την αγνόηση περιττών associated values, και οι σταθερές στα case — τον έλεγχο αντιστοιχίας με συγκεκριμένες τιμές.
Πολλοί αρχάριοι προγραμματιστές συγχέουν τα associated values με raw values. Είναι διαφορετικοί μηχανισμοί με διαφορετικά σενάρια εφαρμογής.
| Χαρακτηριστικό | Raw Values | Associated Values |
|---|---|---|
| Τύπος δεδομένων | Ένας τύπος για όλα τα case | Διαφορετικοί τύποι για κάθε case |
| Στιγμή καθορισμού | Κατά τη δήλωση enum | Κατά τη δημιουργία παρουσίας |
| Υποχρεωτικότητα | Όλα τα case έχουν τιμή | Μερικά case μπορεί να είναι χωρίς τιμή |
| Συμβατότητα | Αμοιβαίος αποκλεισμός — δεν μπορούν να χρησιμοποιηθούν ταυτόχρονα | |
Σύμφωνα με το Swift Evolution, τα associated values εισήχθησαν στη Swift 2.0 ως μέρος του επανασχεδιασμού του enum. Παρέχουν αλγεβρική προσέγγιση στους τύπους, όπου κάθε case είναι ένας ξεχωριστός κατασκευαστής με τη δική του υπογραφή.
Associated values χρησιμοποιούνται ενεργά σε πραγματικά έργα iOS. Ας εξετάσουμε τρία τυπικά σενάρια.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
Με associated values, το enum γίνεται ισχυρό εργαλείο για πεπερασμένα αυτόματα: κάθε case — μια κατάσταση, associated values — οι παράμετροι αυτής της κατάστασης. Ο μεταγλωττιστής εγγυάται ότι όλες οι μεταβάσεις έχουν υποστεί επεξεργασία.
Για έλεγχο ενός case χωρίς switch χρησιμοποιήστε if case ή guard case. Είναι πιο συμπαγές όταν χρειάζεται να επεξεργαστείτε μόνο μία παραλλαγή.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("Το αίτημα έληξε μετά από \(seconds)s")
}
guard case .httpError(let code, _) = error else {
return
}
print("Σφάλμα HTTP με κωδικό \(code)")
Συχνές ερωτήσεις
Ναι, ένα case μπορεί να μην έχει associated values — για παράδειγμα, case unknown. Τέτοια case συμπεριφέρονται σαν συνηθισμένα case enum χωρίς πρόσθετα δεδομένα. Είναι βολικό για καταστάσεις σήμανσης.
Η Swift δεν δημιουργεί αυτόματα Equatable για enum με associated values (πριν από Swift 4.2+). Προσθέστε ρητή υλοποίηση Equatable ή χρησιμοποιήστε switch για σύγκριση κάθε case ξεχωριστά.
Ναι, τα associated values σε indirect enum — τυπική τεχνική για την κατασκευή δέντρων και συνδεδεμένων λιστών. Ένα case μπορεί να περιέχει associated value του ίδιου τύπου με την ένδειξη indirect.
Associated values είναι ασφαλή ως προς τον τύπο — κάθε case έχει εγγυημένα μόνο τα δικά του δεδομένα. Σε struct με προαιρετικά, κάθε παρουσία περιέχει όλα τα πεδία και απαιτούνται έλεγχοι χρόνου εκτέλεσης για nil.
Η Swift δεν δημιουργεί αυτόματα Codable για enum με associated values. Απαιτείται χειροκίνητη υλοποίηση των encode και decode μέσω switch στα case με χρήση custom coding keys.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης