Enumerations

Una enumerazione definisce un tipo comune per un gruppo di valori.

Se avete familiarità con C, saprete che in C le enumerazioni servono per assegnare nomi relativi ad una serie di valori interi. In Swift le enumerazioni sono molto più flessibil. Se un valore (inteso come valore “grezzo”) viene fornito per ciascun membro di enumerazione, il valore può essere una stringa, un carattere o un valore di qualsiasi tipo (intero o in virgola mobile).

In alternativa, le enumerazioni possono specificare valori di qualsiasi tipo, da memorizzare con ciascun valore di tipo diverso , come se creassimo un dizionario che associa due parole in lingue diverse.

Le enumerazioni di Swift adottano molte caratteristiche tradizionalmente supportate solo dalle classi, come ad esempio le proprietà calcolate per fornire ulteriori informazioni sul valore corrente nei vari conteggi, e metodi di istanza per fornire funzionalità legate ai valori di enumerazione. Le enumerazioni possono anche definire initializers, fornendo un valore iniziale.

Enumeration Syntax
Si inizializza un’ enumerazioni con la parola chiave “enum”, inserendo il tutto all’interno di una coppia di parentesi graffe:

enum SomeEnumeration {
// enumeration definition goes here
}
Here’s an example for the four main points of a compass:

enum CompassPoint {
case North
case South
case East
case West
}

I valori definiti in una enumerazione (come Nord, Sud, Est, Ovest) sono i valori dei membri di tale enumerazione. La parola chiave “case” indica che una nuova linea di valori sta per essere definita.

Eventuali valori multipli dei membri dell’enumerazione possono apparire su una sola riga, separati da virgole:

enum Planet {
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

Ogni definizione di enumerazione definisce un nuovo tipo. Come altri tipi di Swift, i loro nomi (come CompassPoint e Planet) devono iniziare con una lettera maiuscola. E’ consigliato dare tipi di enumerazione singolari piuttosto che plurali, in modo che vengano percepiti in modo evidente:

var directionToHead = CompassPoint.West

Il tipo di directionToHead si inferisce quando viene inizializzato con uno dei possibili valori di CompassPoint. Una volta che directionToHead è dichiarato come CompassPoint, è possibile impostare un valore diverso di CompassPoint utilizzando una sintassi breve:

directionToHead = .East

Essendo il tipo di directionToHead già noto, lo si può omettere quando si va ad impostare il suo valore. Questo rende il codice molto più leggibile.
Abbinamento dei valori di enumerazione con un’istruzione switch
È possibile abbinare i valori di enumerazione individuali con un’istruzione switch:

directionToHead = .South
switch directionToHead {
case .North:
println(“Lots of planets have a north”)
case .South:
println(“Watch out for penguins”)
case .East:
println(“Where the sun rises”)
case .West:
println(“Where the skies are blue”)
}
// prints “Watch out for penguins”

Si può leggere questo codice come:

Si consideri il valore di directionToHead. Nel caso in cui esso sia uguale a .North, stampa “Un sacco di pianeti hanno un nord”. Nel caso in cui esso è uguale a  .South, stampare “Fare attenzione ai pinguini”.

… E così via.

Come descritto in Flow Control, un’istruzione switch deve essere esaustiva nel considerare i membri di una enumerazione. Se il case per .West viene omesso, questo codice non verrà compilato, perché non considera la lista completa dei membri CompassPoint. Richiedere esaustività nella stesura del codiceassicura che i membri di enumerazione non vengano accidentalmente omessi.

Quando non è opportuno prevedere un case per ogni membro di enumerazione, è possibile fornire un case di default per coprire tutti i membri che non sono stati dichiarati in modo esplicito:

let somePlanet = Planet.Earth
switch somePlanet {
case .Earth:
println(“Mostly harmless”)
default:
println(“Not a safe place for humans”)
}
// prints “Mostly harmless”

VOLETE ESSERE AGGIORNATI TEMPESTIVAMENTE ALL’USCITA DI UN NUOVO CAPITOLO ? BASTA UN LIKE SULLA NOSTRA PAGINA FACEBOOK!