Enum στη Swift είναι ένας τύπος που ενώνει μια ομάδα σχετικών τιμών κάτω από ένα όνομα. Σε αντίθεση με τη C και Objective-C, όπου το enum είναι απλώς ένα σύνολο ακέραιων σταθερών, η Swift προσφέρει first-class απαριθμήσεις με associated values, raw values, μεθόδους και υποστήριξη πρωτοκόλλων. Σύμφωνα με την Apple, 2026, το enum είναι ένα από τα βασικά εργαλεία για type-safe μοντελοποίηση καταστάσεων στην ανάπτυξη iOS.
Κύρια σημεία
Enum (απαρίθμηση) — είναι ένας τύπος δεδομένων οριζόμενος από τον χρήστη που συνδυάζει ένα πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών. Στη Swift, το enum δεν είναι απλώς αριθμητικές σταθερές, αλλά ένας πλήρης τύπος με τη δική του λογική.
Κάθε παραλλαγή της απαρίθμησης ονομάζεται case. Σε αντίθεση με την Objective-C, όπου το enum ανάγεται σε έναν ακέραιο τύπο, η Swift επιτρέπει σε κάθε case να αποθηκεύει τα δικά του δεδομένα και να έχει μεθόδους.
Σύμφωνα με την Apple, το enum στη Swift υποστηρίζει generics, αρχικοποιητές, υπολογιζόμενες ιδιότητες και υλοποίηση πρωτοκόλλων — αυτό το καθιστά εφαρμόσιμο για τη μοντελοποίηση καταστάσεων, σφαλμάτων, επιλογών και πεπερασμένων αυτομάτων.
Χρησιμοποιήστε το enum παντού όπου χρειάζεται να αναπαραστήσετε ένα πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών: καταστάσεις οθόνης, τύποι σφαλμάτων, κατευθύνσεις, επιλογές φιλτραρίσματος.
Enum δηλώνεται με τη λέξη-κλειδί enum ακολουθούμενη από όνομα και σώμα σε άγκιστρα.
enum CompassDirection {
case north
case south
case east
case west
}
Οι cases μπορούν να δηλωθούν σε μία γραμμή με κόμμα:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Για πρόσβαση σε μια case χρησιμοποιείται τελεία σύνταξη μετά τον γνωστό τύπο:
let direction = CompassDirection.north
// Ο τύπος είναι γνωστός — η συντομευμένη σύνταξη είναι διαθέσιμη:
var currentPlanet = .earth
Μετά την ανάθεση σε μια μεταβλητή γνωστού τύπου enum, η Swift αυτόματα συμπεραίνει τον τύπο και το όνομα της απαρίθμησης μπορεί να παραλειφθεί κατά την πρόσβαση στις cases.
Raw Values — είναι τιμές ίδιου τύπου που αντιστοιχίζονται σε κάθε case του enum. Σε αντίθεση με τα associated values, τα raw values είναι ίδια ως προς τον τύπο για όλες τις cases και ορίζονται κατά τη δήλωση.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
Για ακέραιες raw values, η Swift αυτόματα αυξάνει τις τιμές εάν μόνο η πρώτη έχει οριστεί ρητά:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Οι raw values μπορεί να είναι τύπων Int, String, Character ή οποιουδήποτε τύπου συμμορφώνεται με το πρωτόκολλο RawRepresentable. Η Swift αυτόματα δημιουργεί τον αρχικοποιητή init? για δημιουργία enum από raw value — αυτό είναι βολικό κατά την ανάλυση δεδομένων από API.
Associated Values επιτρέπουν την προσάρτηση διαφορετικών τύπων δεδομένων σε κάθε case της απαρίθμησης ξεχωριστά. Σε αντίθεση με τα raw values, τα associated values μπορεί να διαφέρουν σε τύπο και ποσότητα.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
Κατά την επεξεργασία μέσω switch, τα associated values εξάγονται μέσω σύνδεσης με μεταβλητές ή σταθερές:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("Λήξη χρόνου μετά από \(seconds)s")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("Χωρίς σύνδεση")
case .unknown(let err):
print("Άγνωστο: \(err.localizedDescription)")
}
Σύμφωνα με την τεκμηρίωση της Apple, τα associated values καθιστούν το enum εκφραστικό εργαλείο για τη μοντελοποίηση σύνθετων καταστάσεων χωρίς δημιουργία ξεχωριστών τύπων-περιτυλιγμάτων. Χρησιμοποιήστε τα για σενάρια τύπου Result και μοντελοποίηση σφαλμάτων με συμφραζόμενα.
Αναδρομικό enum — απαρίθμηση της οποίας οι cases αναφέρονται στον ίδιο τον τύπο enum. Τέτοιες cases σημειώνονται με τη λέξη-κλειδί indirect.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
Η λέξη-κλειδί indirect πριν από enum σημειώνει όλες τις cases ως αναδρομικές. Εναλλακτικά, μπορεί να σημειωθεί μόνο μια συγκεκριμένη case με indirect:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Η Swift χρησιμοποιεί το indirect για αποθήκευση αναδρομικών cases ως αναφορές (reference semantics) αντί για τιμές — αυτό αποφεύγει το άπειρο μέγεθος του enum στη στοίβα. Τα αναδρομικά enum χρησιμοποιούνται ευρέως στην κατασκευή δέντρων, συνδεδεμένων λιστών και AST.
Enum μπορεί να υλοποιεί πρωτόκολλα όπως οι δομές και οι κλάσεις. Αυτή είναι μια βασική δυνατότητα του πρωτοκόλλο-στραμμένου προγραμματισμού στη Swift.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
Το enum μπορεί επίσης να υλοποιεί πρωτόκολλα Cocoa — για παράδειγμα, CaseIterable για αυτόματη δημιουργία συλλογής όλων των cases ή Codable για σειριοποίηση. Αυτό καθιστά το enum ένα καθολικό δομικό στοιχείο σε εφαρμογές Swift.
Συχνές ερωτήσεις
Enum — είναι τύπος με πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών, ενώ το struct είναι τύπος με αυθαίρετο σύνολο ιδιοτήτων. Το enum δεν μπορεί να έχει stored properties, αλλά υποστηρίζει computed properties και μεθόδους.
Όχι, το enum δεν μπορεί να έχει ταυτόχρονα raw values και associated values. Τα raw values είναι τιμές ίδιου τύπου για όλες τις cases, τα associated values είναι μεμονωμένα δεδομένα για κάθε case. Αυτοί οι μηχανισμοί είναι αμοιβαία αποκλειόμενοι.
Προσθέστε συμμόρφωση με το πρωτόκολλο CaseIterable. Η Swift αυτόματα δημιουργεί την ιδιότητα allCases που επιστρέφει μια συλλογή όλων των cases με σειρά δήλωσης. Αυτό είναι βολικό για επανάληψη σε όλες τις παραλλαγές.
Switch — είναι η ασφαλέστερη μέθοδος, καθώς ο μεταγλωττιστής ελέγχει την εξαντλητική κάλυψη. Μπορείτε να χρησιμοποιήσετε if case για έλεγχο μιας case ή == για enum χωρίς associated values.
Ναι, το enum υποστηρίζει generics: enum Result<T, E> { case success(T); case failure(E) }. Αυτό επιτρέπει τη δημιουργία type-safe γενικών κατασκευών για χειρισμό επιτυχίας και σφάλματος.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης