Enum στη Swift — τι είναι, σύνταξη και χρήση

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-17 Χρόνος ανάγνωσης: 6 λεπ

Enum στη Swift είναι ένας τύπος που ενώνει μια ομάδα σχετικών τιμών κάτω από ένα όνομα. Σε αντίθεση με τη C και Objective-C, όπου το enum είναι απλώς ένα σύνολο ακέραιων σταθερών, η Swift προσφέρει first-class απαριθμήσεις με associated values, raw values, μεθόδους και υποστήριξη πρωτοκόλλων. Σύμφωνα με την Apple, 2026, το enum είναι ένα από τα βασικά εργαλεία για type-safe μοντελοποίηση καταστάσεων στην ανάπτυξη iOS.

Κύρια σημεία

  • Enum — τύπος για ομάδα σχετικών τιμών, παρέχοντας type-safety
  • Raw values — ίδιες τιμές ίδιου τύπου για όλες τις cases της απαρίθμησης
  • Associated values — διαφορετικοί τύποι δεδομένων, προσαρτημένοι σε κάθε case ξεχωριστά
  • Cases δηλώνονται με τη λέξη-κλειδί case και μπορούν να περιέχουν μεθόδους
  • Switch με enum απαιτεί εξαντλητική κάλυψη όλων των παραλλαγών από τον μεταγλωττιστή

Τι είναι το enum στη Swift;

Enum (απαρίθμηση) — είναι ένας τύπος δεδομένων οριζόμενος από τον χρήστη που συνδυάζει ένα πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών. Στη Swift, το enum δεν είναι απλώς αριθμητικές σταθερές, αλλά ένας πλήρης τύπος με τη δική του λογική.

Κάθε παραλλαγή της απαρίθμησης ονομάζεται case. Σε αντίθεση με την Objective-C, όπου το enum ανάγεται σε έναν ακέραιο τύπο, η Swift επιτρέπει σε κάθε case να αποθηκεύει τα δικά του δεδομένα και να έχει μεθόδους.

Σύμφωνα με την Apple, το enum στη Swift υποστηρίζει generics, αρχικοποιητές, υπολογιζόμενες ιδιότητες και υλοποίηση πρωτοκόλλων — αυτό το καθιστά εφαρμόσιμο για τη μοντελοποίηση καταστάσεων, σφαλμάτων, επιλογών και πεπερασμένων αυτομάτων.

Χρησιμοποιήστε το enum παντού όπου χρειάζεται να αναπαραστήσετε ένα πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών: καταστάσεις οθόνης, τύποι σφαλμάτων, κατευθύνσεις, επιλογές φιλτραρίσματος.

Σύνταξη δήλωσης enum

Enum δηλώνεται με τη λέξη-κλειδί enum ακολουθούμενη από όνομα και σώμα σε άγκιστρα.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

Οι cases μπορούν να δηλωθούν σε μία γραμμή με κόμμα:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Για πρόσβαση σε μια case χρησιμοποιείται τελεία σύνταξη μετά τον γνωστό τύπο:

swift
let direction = CompassDirection.north
// Ο τύπος είναι γνωστός — η συντομευμένη σύνταξη είναι διαθέσιμη:
var currentPlanet = .earth

Μετά την ανάθεση σε μια μεταβλητή γνωστού τύπου enum, η Swift αυτόματα συμπεραίνει τον τύπο και το όνομα της απαρίθμησης μπορεί να παραλειφθεί κατά την πρόσβαση στις cases.

Raw Values στις απαριθμήσεις

Raw Values — είναι τιμές ίδιου τύπου που αντιστοιχίζονται σε κάθε case του enum. Σε αντίθεση με τα associated values, τα raw values είναι ίδια ως προς τον τύπο για όλες τις cases και ορίζονται κατά τη δήλωση.

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

Για ακέραιες raw values, η Swift αυτόματα αυξάνει τις τιμές εάν μόνο η πρώτη έχει οριστεί ρητά:

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 στο enum

Associated Values επιτρέπουν την προσάρτηση διαφορετικών τύπων δεδομένων σε κάθε case της απαρίθμησης ξεχωριστά. Σε αντίθεση με τα raw values, τα associated values μπορεί να διαφέρουν σε τύπο και ποσότητα.

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

Κατά την επεξεργασία μέσω switch, τα associated values εξάγονται μέσω σύνδεσης με μεταβλητές ή σταθερές:

swift
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 (indirect)

Αναδρομικό enum — απαρίθμηση της οποίας οι cases αναφέρονται στον ίδιο τον τύπο enum. Τέτοιες cases σημειώνονται με τη λέξη-κλειδί indirect.

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

Η λέξη-κλειδί indirect πριν από enum σημειώνει όλες τις cases ως αναδρομικές. Εναλλακτικά, μπορεί να σημειωθεί μόνο μια συγκεκριμένη case με indirect:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Η Swift χρησιμοποιεί το indirect για αποθήκευση αναδρομικών cases ως αναφορές (reference semantics) αντί για τιμές — αυτό αποφεύγει το άπειρο μέγεθος του enum στη στοίβα. Τα αναδρομικά enum χρησιμοποιούνται ευρέως στην κατασκευή δέντρων, συνδεδεμένων λιστών και AST.

Enum και πρωτόκολλα

Enum μπορεί να υλοποιεί πρωτόκολλα όπως οι δομές και οι κλάσεις. Αυτή είναι μια βασική δυνατότητα του πρωτοκόλλο-στραμμένου προγραμματισμού στη Swift.

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 στη Swift;

Enum — είναι τύπος με πεπερασμένο σύνολο αμοιβαία αποκλειόμενων παραλλαγών, ενώ το struct είναι τύπος με αυθαίρετο σύνολο ιδιοτήτων. Το enum δεν μπορεί να έχει stored properties, αλλά υποστηρίζει computed properties και μεθόδους.

Μπορεί το enum να έχει ταυτόχρονα raw values και associated values;

Όχι, το enum δεν μπορεί να έχει ταυτόχρονα raw values και associated values. Τα raw values είναι τιμές ίδιου τύπου για όλες τις cases, τα associated values είναι μεμονωμένα δεδομένα για κάθε case. Αυτοί οι μηχανισμοί είναι αμοιβαία αποκλειόμενοι.

Πώς να λάβετε έναν πίνακα όλων των cases ενός enum;

Προσθέστε συμμόρφωση με το πρωτόκολλο CaseIterable. Η Swift αυτόματα δημιουργεί την ιδιότητα allCases που επιστρέφει μια συλλογή όλων των cases με σειρά δήλωσης. Αυτό είναι βολικό για επανάληψη σε όλες τις παραλλαγές.

Είναι υποχρεωτική η χρήση switch για την επεξεργασία enum;

Switch — είναι η ασφαλέστερη μέθοδος, καθώς ο μεταγλωττιστής ελέγχει την εξαντλητική κάλυψη. Μπορείτε να χρησιμοποιήσετε if case για έλεγχο μιας case ή == για enum χωρίς associated values.

Μπορεί να δημιουργηθεί enum με generics;

Ναι, το enum υποστηρίζει generics: enum Result<T, E> { case success(T); case failure(E) }. Αυτό επιτρέπει τη δημιουργία type-safe γενικών κατασκευών για χειρισμό επιτυχίας και σφάλματος.

Σύνοψη

  • Enum στη Swift — πλήρης τύπος με υποστήριξη μεθόδων, generics και πρωτοκόλλων
  • Raw values επιτρέπουν τον ορισμό ίδιων τιμών ίδιου τύπου για όλες τις cases
  • Associated values δίνουν τη δυνατότητα προσάρτησης διαφορετικών δεδομένων σε κάθε case
  • Indirect cases είναι απαραίτητες για αναδρομικές δομές στο enum
  • Πρωτόκολλα μπορούν να υλοποιηθούν από enum — αυτή είναι η βάση του POP στη Swift
  • Switch με enum εγγυάται εξαντλητική επεξεργασία σε επίπεδο μεταγλώττισης
  • Χρησιμοποιήστε το enum για μοντελοποίηση πεπερασμένων καταστάσεων και type-safe επιλογών

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης