Enum în Swift — ce este, sintaxa și utilizarea

Autor: IT Sectr Publicat: 2026-06-17 Timp de citire: 6 min

Enum în Swift este un tip care unește un grup de valori înrudite sub un singur nume. Spre deosebire de C și Objective-C, unde enum este doar un set de constante întregi, Swift oferă enumerări first-class cu associated values, raw values, metode și suport pentru protocoale. Conform Apple, 2026, enum este unul dintre instrumentele cheie pentru modelarea tip-safe a stărilor în dezvoltarea iOS.

Puncte cheie

  • Enum — tip pentru un grup de valori înrudite, asigurând tip-siguranța
  • Raw values — valori identice de același tip pentru toate cazurile enumerării
  • Associated values — tipuri diferite de date, asociate fiecărui caz individual
  • Cazurile se declară cu cuvântul cheie case și pot conține metode
  • Switch cu enum necesită acoperirea exhaustivă a tuturor variantelor de către compilator

Ce este enum în Swift?

Enum (enumerare) — este un tip de date definit de utilizator care combină un set finit de variante care se exclud reciproc. În Swift, enum nu este doar constante numerice, ci un tip complet cu propria logică.

Fiecare variantă a enumerării se numește caz. Spre deosebire de Objective-C, unde enum se reduce la un tip întreg, Swift permite fiecărui caz să stocheze propriile date și să aibă metode.

Conform Apple, enum în Swift suportă generice, inițializatoare, proprietăți calculate și implementarea protocoalelor — aceasta îl face aplicabil pentru modelarea stărilor, erorilor, opțiunilor și automatelor finite.

Folosiți enum oriunde este necesar să reprezentați o mulțime finită de variante care se exclud reciproc: stări ale ecranului, tipuri de erori, direcții, opțiuni de filtrare.

Sintaxa declarării enum

Enum se declară cu cuvântul cheie enum urmat de nume și corpul între acolade.

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

Cazurile pot fi declarate pe o singură linie cu virgulă:

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

Pentru a accesa un caz se folosește sintaxa cu punct după tipul cunoscut:

swift
let direction = CompassDirection.north
// Tipul este cunoscut — sintaxa prescurtată este disponibilă:
var currentPlanet = .earth

După atribuirea variabilei unui tip enum cunoscut, Swift deduce automat tipul și se poate omite numele enumerării la accesarea cazurilor.

Raw Values în enumerări

Raw Values — sunt valori de același tip care sunt atribuite fiecărui caz al enum. Spre deosebire de associated values, raw values sunt identice ca tip pentru toate cazurile și se stabilesc la declarare.

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

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

Pentru raw values întregi, Swift incrementează automat valorile dacă doar primul este specificat explicit:

swift
enum Status: Int {
    case pending = 1
    case active      // 2
    case completed   // 3
}

Raw values pot fi de tipurile Int, String, Character sau orice tip care se conformează protocolului RawRepresentable. Swift generează automat inițializatorul init? pentru crearea unui enum dintr-o raw value — util la parsarea datelor din API.

Associated Values în enum

Associated Values permit atașarea diferitelor tipuri de date la fiecare caz al enumerării individual. Spre deosebire de raw values, associated values pot diferi ca tip și cantitate.

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

La procesarea prin switch, associated values se extrag prin legarea la variabile sau constante:

swift
let error = NetworkError.httpError(code: 403, message: "Forbidden")

switch error {
case .timeout(let seconds):
    print("Timeout după \(seconds)s")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("Fără conexiune")
case .unknown(let err):
    print("Necunoscut: \(err.localizedDescription)")
}

Conform documentației Apple, associated values fac din enum un instrument expresiv pentru modelarea stărilor complexe fără a crea tipuri wrapper separate. Folosiți-le pentru scenarii de tip Result și modelarea erorilor cu context.

Enum recursiv (indirect)

Enum recursiv — enumerare ale cărei cazuri se referă la însuși tipul enum. Astfel de cazuri se marchează cu cuvântul cheie indirect.

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

Cuvântul cheie indirect înainte de enum marchează toate cazurile ca recursive. Alternativ, se poate marca doar un anumit caz cu indirect:

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

Swift folosește indirect pentru a stoca cazurile recursive ca referințe (reference semantics) în loc de valori — aceasta evită dimensiunea infinită a enum pe stivă. Enumerările recursive sunt utilizate pe scară largă la construirea arborilor, listelor înlănțuite și AST.

Enum și protocoale

Enum poate implementa protocoale la fel ca structurile și clasele. Aceasta este o capacitate cheie a programării orientate pe protocoale în 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 poate implementa și protocoale Cocoa — de exemplu, CaseIterable pentru generarea automată a colecției tuturor cazurilor sau Codable pentru serializare. Acest lucru face din enum un bloc de construcție universal în aplicațiile Swift.

Întrebări frecvente

Cu ce diferă enum de struct în Swift?

Enum — este un tip cu un set finit de variante care se exclud reciproc, iar struct — un tip cu un set arbitrar de proprietăți. Enum nu poate avea stored properties, dar suportă computed properties și metode.

Poate enum să aibă atât raw values, cât și associated values simultan?

Nu, enum nu poate avea simultan raw values și associated values. Raw values — sunt valori de același tip pentru toate cazurile, associated values — date individuale pentru fiecare caz. Aceste mecanisme se exclud reciproc.

Cum se obține un tablou cu toate cazurile unui enum?

Adăugați conformitatea cu protocolul CaseIterable. Swift va genera automat proprietatea allCases, care returnează o colecție a tuturor cazurilor în ordinea declarării. Acest lucru este convenabil pentru iterarea prin toate variantele.

Este obligatoriu să folosiți switch pentru procesarea enum?

Switch — este cea mai sigură metodă, deoarece compilatorul verifică acoperirea exhaustivă. Se poate folosi if case pentru verificarea unui singur caz sau == pentru enum fără associated values.

Se poate crea un enum cu generice?

Da, enum suportă generice: enum Result<T, E> { case success(T); case failure(E) }. Aceasta permite crearea de construcții generice tip-sigure pentru procesarea succesului și erorii.

Concluzii

  • Enum în Swift — tip complet cu suport pentru metode, generice și protocoale
  • Raw values permit setarea unor valori identice de același tip pentru toate cazurile
  • Associated values oferă posibilitatea de a atașa date diferite fiecărui caz
  • Indirect cazurile sunt necesare pentru structuri recursive în enum
  • Protocoalele pot fi implementate de enum — aceasta este baza POP în Swift
  • Switch cu enum garantează procesarea exhaustivă la nivel de compilare
  • Folosiți enum pentru modelarea stărilor finite și opțiunilor tip-sigure

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și