Enum in Swift — cos'è, sintassi e utilizzo

Autore: IT Sectr Pubblicato: 2026-06-17 Tempo di lettura: 6 min

Enum in Swift è un tipo che unisce un gruppo di valori correlati sotto un unico nome. A differenza di C e Objective-C, dove enum è solo un insieme di costanti intere, Swift offre enumerazioni di prima classe con associated values, raw values, metodi e supporto ai protocolli. Secondo Apple, 2026, enum è uno degli strumenti chiave per la modellazione type-safe degli stati nello sviluppo iOS.

Punti Chiave

  • Enum — un tipo per un gruppo di valori correlati, che garantisce type safety
  • Raw Values — valori dello stesso tipo assegnati a tutti i casi dell'enumerazione
  • Associated Values — diversi tipi di dati allegati a ciascun caso individualmente
  • Casi dichiarati con la parola chiave case e possono contenere metodi
  • Switch con enum richiede una gestione esaustiva da parte del compilatore

Cos'è enum in Swift?

Enum (enumerazione) è un tipo di dato personalizzato che unisce un insieme finito di varianti mutuamente esclusive. In Swift, enum non sono solo costanti numeriche, ma un tipo completo con la propria logica.

Ogni variante dell'enumerazione è chiamata caso. A differenza di Objective-C, dove enum si riduce a un tipo intero, Swift permette a ciascun caso di memorizzare i propri dati e avere metodi.

Secondo Apple, enum in Swift supporta generics, inizializzatori, proprietà calcolate e conformità ai protocolli — rendendolo applicabile per modellare stati, errori, opzioni e macchine a stati finiti.

Usa enum ovunque sia necessario rappresentare un insieme finito di varianti mutuamente esclusive: stati dello schermo, tipi di errore, direzioni, opzioni di filtraggio.

Sintassi di dichiarazione di enum

Enum viene dichiarato con la parola chiave enum seguita da un nome e un corpo tra parentesi graffe.

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

I casi possono essere dichiarati su una singola riga separati da virgola:

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

Per accedere a un caso, usa la sintassi punto dopo il tipo noto:

swift
let direction = CompassDirection.north
// Tipo noto — sintassi abbreviata disponibile:
var currentPlanet = .earth

Una volta che a una variabile viene assegnato un tipo enum noto, Swift deduce automaticamente il tipo, consentendo di omettere il nome dell'enumerazione quando si accede ai casi.

Raw Values nelle enumerazioni

Raw Values sono valori di un singolo tipo assegnati a ciascun caso di enum. A differenza degli associated values, i raw values sono dello stesso tipo per tutti i casi e vengono definiti al momento della dichiarazione.

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

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

Per i raw values interi, Swift incrementa automaticamente i valori se solo il primo è impostato esplicitamente:

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

I raw values possono essere dei tipi Int, String, Character o qualsiasi tipo conforme al protocollo RawRepresentable. Swift genera automaticamente l'inizializzatore init? per creare un enum da un raw value — comodo per analizzare dati dalle API.

Associated Values in enum

Associated Values consentono di associare diversi tipi di dati a ciascun caso di enum individualmente. A differenza dei raw values, gli associated values possono differire per tipo e quantità.

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

Quando si elabora con switch, gli associated values vengono estratti tramite binding a variabili o costanti:

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

switch error {
case .timeout(let seconds):
    print("Timeout dopo \(seconds)s")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("Nessuna connessione")
case .unknown(let err):
    print("Sconosciuto: \(err.localizedDescription)")
}

Secondo la documentazione Apple, gli associated values rendono enum uno strumento espressivo per modellare stati complessi senza creare tipi wrapper separati. Usali per scenari simili a Result e modellazione di errori con contesto.

Enum ricorsivo (indirect)

Enum ricorsivo — un'enumerazione i cui casi fanno riferimento al tipo enum stesso. Tali casi vengono contrassegnati con la parola chiave indirect.

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

Usare indirect prima di enum contrassegna tutti i casi come ricorsivi. In alternativa, è possibile contrassegnare solo un caso specifico con indirect:

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

Swift usa indirect per memorizzare i casi ricorsivi come riferimenti (semantica di riferimento) invece che come valori — questo evita la dimensione infinita dell'enum sullo stack. Gli enum ricorsivi sono ampiamente utilizzati nella costruzione di alberi, liste collegate e AST.

Enum e protocolli

Enum può essere conforme ai protocolli proprio come strutture e classi. Questa è una caratteristica fondamentale della programmazione orientata ai protocolli in 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 può anche essere conforme ai protocolli Cocoa — ad esempio, CaseIterable per la generazione automatica di una raccolta di tutti i casi, o Codable per la serializzazione. Questo rende enum un elemento costruttivo versatile nelle applicazioni Swift.

Domande Frequenti

Come si differenzia enum da struct in Swift?

Enum è un tipo con un insieme finito di varianti mutuamente esclusive, mentre struct è un tipo con un insieme arbitrario di proprietà. Enum non può avere stored properties, ma supporta computed properties e metodi.

Un enum può avere sia raw values che associated values contemporaneamente?

No, un enum non può avere contemporaneamente raw values e associated values. I raw values sono valori dello stesso tipo per tutti i casi, mentre gli associated values sono dati individuali per ciascun caso. Questi meccanismi si escludono a vicenda.

Come ottenere un array di tutti i casi di un enum?

Aggiungi la conformità al protocollo CaseIterable. Swift genererà automaticamente la proprietà allCases, restituendo una raccolta di tutti i casi nell'ordine di dichiarazione. È comodo per iterare su tutte le varianti.

È obbligatorio usare switch per gestire un enum?

Switch è l'approccio più sicuro perché il compilatore verifica la copertura esaustiva. Puoi usare if case per controllare un singolo caso o == per enum senza associated values.

Si può creare un enum con i generics?

, enum supporta i generics: enum Result<T, E> { case success(T); case failure(E) }. Questo permette di creare costrutti generici type-safe per gestire successo ed errore.

Riepilogo

  • Enum in Swift è un tipo completo con supporto per metodi, generics e protocolli
  • Raw Values consentono di impostare valori dello stesso tipo per tutti i casi
  • Associated Values consentono di associare dati diversi a ciascun caso
  • Casi Indirect sono necessari per strutture ricorsive in enum
  • Protocolli possono essere implementati da enum — questa è la base di POP in Swift
  • Switch con enum garantisce una gestione esaustiva in fase di compilazione
  • Usa enum per modellare stati finiti e opzioni type-safe

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche