Enumerations in Swift

Le enumerations sono un tipo di dato che rappresenta un gruppo di valori correlati; in C e Objective-C permettono di assegnare dei nomi ad un set di valori di tipo intero mentre in Swift le enumerations rappresentano uno strumento molto più flessibile e potente.

La sintassi è molto semplice: attraverso la keyword enum è possibile definire una nuova enumeration; trattandosi di un tipo di dato è importante ricordare che in Swift deve cominciare con una lettera maiuscola:

L’esempio precedente rappresenta lo scheletro vuoto di una enumeration (quindi assolutamente inutile). Aggiungiamo i possibili valori, o per essere più precisi gli enumeration cases.

A differenza di Objective-C ad ogni enumeration case non viene assegnato automaticamente un valore di tipo intero; per cui se non si assegnano esplicitamente i valori, la stessa enumeration può essere scritta raggruppando i cases:

A questo punto è possibile usare l’enumeration appena definita:

nel primo caso ( primoEsempioVarEnum ) è dichiarato esplicitamente il tipo della variabile, nel seccondo ( secondoEsempioVarEnum ) invece viene dedotto automaticamente dall’assegnazione.

E’ ovviamente possibile utilizzare uno switch per confrontare e gestire i singoli case:

In swift quando si usa uno switch per processare i possibili case di un enumerations, devono essere presenti tutti i casi affinchè il codice sia compilato (a switch must be exhaustive); in alternativa si può usare un default per gestire i case dell’enumeration non esplicitamente gestiti:

Associated Values

Le associated values permettono di associare un valore ad un case di un enumeration in fase di inizializzazione:

Come è chiaramente visibile nell’esempio è possibile definire tipi di dati diversi per i singoli case.

Per accedere ai valori associati di un enumeration è necessario usare l’istruzione switch:

Non è possibile accedere direttamente al valore associato senza uno switch ma è possibile farlo in maniera più conveniente utilizzando una funzione o una proprietà all’interno dell’enumeration (come spiegato all’interno del paragrafo Proprietà e funzioni).

Raw Values

E’ possibile associare in fase di definizione dell’enumaration un valore di default ai singoli case

A differenza di quanto definito in precedenza per gli associated values, il tipo di dato deve essere il medesimo per tutti i case dell’enumeration.
Possiamo definire anche solo il valore di default per il primo case:

In questo esempio TestEnum.uno ha un valore esplicitamente definito uguale a 1; i valori degli altri case vengono assegnati automaticamente: TestEnum.due avrà un valore uguale a 2 e così via. Sono chiamati Implicitly Assigned Raw Values e possono essere utilizzati con enumerations i cui valori di default siano interi o stringhe.

Nell’esempio precedente PuntiCardinali.nord ha un valore di default implicito uguale a “nord”.

Proprietà e funzioni

Le enumerations possono anche contenere funzioni e proprietà:

Enumeration Ricorsive

Una enumerazione ricorsiva è una enumeration all’interno della quale uno o più case hanno come valore associato una istanza della stessa enumeration. Si usa la keyword indirect per definire un case ricorsivo:

Eì possibile utilizzare la keyword indirect anche prima di enum per abilitare l’enumerazione ricorsiva per tutti i case.

Una funzione ricorsiva è un modo semplice per lavorare con i dati che hanno una struttura ricorsiva. Ad esempio, ecco una funzione che valuta un’espressione aritmetica: