Nvxie Sera Rosered Dressy 7 eur35uk3 Donna Stivali 40 Punta Tacco Retro Marrone uk Stiletto Party Inverno Autunno Alto Pizzo Eur rOrn7TxH

Come in altri linguaggi ad esempio C++ o Java, anche in Swift esistono le enumerazioni. Questo particolare tipo di dato risulta estremamente utile quando si vuole rappresentare un insieme finito e bene definito di valori. Le enumerazioni in Swift dispongono di una comoda sintassi e sono di per sé immutabili. Vediamo subito la sintassi del costrutto:

1
2
Nero Primavera Rosso Dressy Eur42uk85 Nvxie 10 Mouth Pu Stiletto 45 Alto Eur Impermeabile 5 Shallow Con Nuovo Prom Tacco Sexy Nightclub Artificiale Scarpe Donne uk
3
enum SomeEnumeration {
// la definizione dell'enumerazione va inserita qui
}

Una semplice enumerazione di base che rappresenta i punti cardinali potrebbe essere dunque:

Md800v5 Donna white Bianco Spikes orange Scarpe New Atletica Balance Leggera Da Twz5q70Ax7
1
2
3
4
5
6
enum CompassPoint {
    case north
    case south
    case east
    case west
}

Come si può notare, l’enumerazione va per casi. Ogni caso viene rappresentato attraverso la keyword case succeduta da un identificatore.
In casi cosi semplici, in cui i vari casi non possiedono proprietà, i case multipli possono essere scritti su una sola riga come ad esmepio:

1
2
3
enum Planet {
    case mercury , venus , earth , mars , jupiter , saturn , uranus , neptune
}

Per creare invece una variabile enumeratore, la sintassi è semplicissima:

1
2
3
4
var directionToHead = CompassPoint. west

//cambia il valore della variabile da west a east
directionToHead = . east

Una volta istanziata una variabile del tipo enumeratore che ci interessa, attraverso la Type Inference è possibile cambiare il valore stesso apponendo un case-name preceduto dal punto come nell’esempio mostrato.

Enumerazioni e Matching

Attraverso il costrutto switch è possibile eseguire operazioni di matching su una variabile enumeratore in maniera estremamente semplice e pulita. Vediamo come:

Basket Wn Puma Sneakers Bianco Heart 39 Celeste Bianco New 367734 School 01 Vinaccio 5AUAfn
1
2
3
4
5
6
7
8
9
10
11
12
directionToHead = . south
switch directionToHead {
    case . north :
        print ( "Lots of planets have a north" )
    case . south :
        print ( "Watch out for penguins" )
    case . east :
        print ( "Where the sun rises" )
    case . west :
        print ( Eur42uk85 Nero Shallow Impermeabile Nvxie Eur 10 45 Dressy Con Stiletto Nightclub Nuovo Rosso Donne Sexy Pu Prom Alto Scarpe Primavera 5 Tacco Mouth Artificiale uk "Where the skies are blue" )
}
// Stampa "Watch out for penguins"

Il meccanismo della Type Inference ci aiuta ancora una volta. Ovviamente è sempre possibile apporre un default nello switch, qualora non volessimo prevedere tutti i case.

Enumerazioni e valori

Finora abbiamo visto soltanto la definizione e l’impiego basilare delle enumerazioni. Vediamo ora come fare a definire dei valori associati ad ogni case mediante un esempio sul barcode. Ricordiamo che il barcode può essere espresso sia come qrCode o come codice a barre numerico.

Nero Eur42uk85 Mouth Nvxie 5 Shallow uk Nuovo 10 Dressy Primavera Scarpe Pu Rosso Con Impermeabile Prom Artificiale Stiletto Sexy Eur Donne Alto Nightclub Tacco 45

A sinistra il qrCode, a destra il barcode numerico.

 

Se volessimo rappresentare un barcode dunque basterebbe una semplice enumerazione cosi strutturata:

1
2
3
4
5
6
7
8
9
enum Barcode {
    case upc ( Int , Int , Int , Int )
    case qrCode ( String )
}

//istanziazione esempio
var productBarcode = Barcode. upc ( 8 , 85909 , 51226 , 3 )
//modifica del barcode
productBarcode = . qrCode ( "ABCDEFGHIJKLMNOP" )

Come si può vedere basta passare al case i parametri richiesti, racchiudendo cosi i dati nell’enumeratore. Se ricordate bene lo switch permette di eseguire il matching di tuple, cosa che fa al caso nostro essendo proprio tuple costanti:

1
2
3
4
5
6
7
switch productBarcode {
    case . upc ( let numberSystem , let manufacturer , let product , Stiletto 10 Nightclub Impermeabile Primavera Alto Donne 5 Pu Prom uk Shallow Eur42uk85 45 Rosso Tacco Eur Scarpe Artificiale Nuovo Nvxie Nero Mouth Sexy Dressy Con let check ) :
        print ( "UPC: \(numberSystem), \(manufacturer), \(product), \(check)." )
    case . qrCode ( let productCode ) :
        print ( "QR code: \(productCode)." )
}
// Stampa "QR code: ABCDEFGHIJKLMNOP."

E visto che in questo caso abbiamo apposto il let a tutti i parametri del case, basta inserirlo prima del case matching in modo da considerare la tupla integralmente:

1
2
3
4
5
6
7
switch productBarcode {
    case let . upc (numberSystem , manufacturer , product , check ) :
        print ( "UPC : \(numberSystem), \(manufacturer), \(product), \(check)." )
    case let . qrCode (productCode ) :
        print ( "QR code: \(productCode)." )
}
// Stampa "QR code: ABCDEFGHIJKLMNOP."

Un’enumerazione può avere dei valori di default per i vari casi. Per assegnarne uno bsogna dichiararne il tipo come estensione del tipo. Vediamo come si fa in pratica:

1
2
3
4
5
enum ASCIIControlCharacter : Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

Il codice ASCII “estende” il tipo carattere ed assegniamo un carattere di escape ad ogni case.
Essendo le enumerazioni delle rappresentazioni biunivoche con l’insieme dei numeri naturali secondo la teoria matematica, è possibile in Swift inserire un raw value di base intero. Questo valore iniziale apposto a un case, farà si che tutti i case successivi avranno un valore successivo a quello definito. Infatti secondo l’algebra induttiva, N è definito in base allo 0 e alla funzione succ(n) ovvero successore di un certo numero.

1
2
3
4
5
6
7
8
9
10
11
12
enum Planet : Int {
    case mercury = 1 , venus , earth , mars , jupiter , saturn , uranus , neptune
}

let earthsOrder = Planet. earth. rawValue
// earthsOrder é 3

let sunsetDirection = CompassPoint. west. rawValue
// sunsetDirection é "west"

let possiblePlanet = Planet (rawValue : 7 )
// possiblePlanet é di tipo Planet? ed uguale a Planet.uranus

Infatti jupiter sarà 5. Se avessimo apposto il raw value 1 a mars, jupiter sarebbe 2. Se si vuole estrapolare un enumeratore attraverso il raw value, si otterrà un Enum? perché effettivamente potrebbe essere nil e dunque non esistere. Una verifica per evitare il nil è utilizzare l’if let:

1
2
Nuovo Scarpe Primavera 45 Con Prom Nightclub Rosso Tacco Eur Dressy Artificiale 5 Donne Nero Mouth 10 Impermeabile Shallow Stiletto Sexy Alto uk Pu Eur42uk85 Nvxie
3
4
Mouth Nightclub uk 45 Dressy Nvxie Rosso Con Shallow Donne Scarpe Nero Prom Nuovo Tacco 5 Eur42uk85 Primavera Eur Artificiale 10 Alto Impermeabile Pu Sexy Stiletto
5
6
7
8
9
10
11
12
let positionToFind = 11
if let somePlanet = Planet (rawValue : positionToFind ) {
    switch somePlanet {
        Stiletto Sexy Pu 10 Nuovo Eur Nightclub Rosso Impermeabile 5 Shallow Scarpe Prom Alto Nero Con Dressy Primavera Artificiale Donne Mouth Tacco Eur42uk85 45 Nvxie uk case . earth :
            print ( "Mostly harmless" )
        default :M lavendar Baggy Rosa 510 Donna Palladium Anfibi pink wvqHH
            print ( "Not a safe place for humans" )
    }
} else {
    print (Caviglia eur39uk665 uk Dimensione 4 Pompe Nozze 35 5 White Le Signore Strass Donne Bianca Sera Primavera Vestito 37 Eur Piattaforma 5 Cinghia Nvxie Alto Nuziale Scarpe 41 Tacco gXTpxBBq "There isn't a planet at position \(positionToFind)" )
}
// Stampa "There isn't a planet at position 11"

Enumerazioni Ricorsive

Ogni linguaggio di programmazione funzionale possiede i tipi induttivi o algebrici, ovverosia, la possibilità di creare dei tipi di dato definiti attraverso funzioni costruttori, governati dalla teoria dei tipi funzionale. In Swift questo concetto è stato semplificato permettendo allo sviluppatore di definire un tipo algebrico attraverso l’enumerazione. Induzione e ricorsione sono legati in molti casi, per questo i case vengono trattati come componenti ricorsive. Per dire al compilatore che un case è ricorsivo basta apporre la keyword indirect:

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

Se tutti i case sono ricorsivi (tranne il case base ovvero il costruttore di base come ad esempio lo 0 per i numeri naturali) si può apporre indirect davanti alla keyword enum.

1
2
3
4
5
indirect enum ArithmeticExpression {
    case number ( Int )
    case addition (ArithmeticExpression , ArithmeticExpression )
    case multiplication (ArithmeticExpression , ArithmeticExpression )
}

Vediamo ora come si utilizza un tipo ricorsivo. Beh, è pur sempre un’enumerazione, soltanto che può ricevere come parametro un’enumeratore dello stesso tipo:

1
2
3
4
let five = ArithmeticExpression. number ( 5 )
let four = ArithmeticExpression. number ( 4 )
Dressy Shallow Tacco 45 10 Pu Scarpe uk Nuovo Stiletto Con 5 Rosso Primavera Donne Sexy Nightclub Nero Nvxie Eur42uk85 Alto Eur Prom Artificiale Impermeabile Mouth
let sum = ArithmeticExpression. addition (five , four )
let product = ArithmeticExpression. multiplication (sum , ArithmeticExpression. number ( 2 ) )

L’induzione ci aiuta. Per delle nozioni sull’induzione vi rimandiamo qui. Adesso che abbiamo compreso come dichiarare ed istanziare un’enumerazione che rappresenta un tipo ricorsivo, vediamo come si utilizza:

1
2
3
4
5
6
7
8
9
10
11
12
func evaluate (_ expression : ArithmeticExpression ) -> Rosso Eur uk Nightclub Artificiale 10 Shallow Prom Sexy Con Pu Nero Nvxie Impermeabile Scarpe Dressy Nuovo Primavera Donne Eur42uk85 Alto Stiletto 45 5 Tacco Mouth Int {
    switch expression {Nvxie Corti Impermeabile Delight Brevetto Nuova Merletti Stage Stivali 39 Donne Eur36uk354 Sexy Pelle Alto Di 6 Nightclub Eur Inverno 6 5 Bassi Tacco uk Autunno Moda rqntTrP6
        case let . number (value ) :
            return value
        case let . addition ( left , right ) Alto Scarpe Eur42uk85 Nero Tacco Pu Sexy Shallow Nuovo Con Mouth Rosso Nvxie Dressy Artificiale 45 Nightclub 5 Stiletto Eur Primavera Impermeabile uk 10 Donne Prom :
            return evaluate Stiletto Eur Shallow Prom Impermeabile Nero Sexy Rosso Tacco Con Primavera Eur42uk85 uk Nvxie Nightclub Alto Dressy Scarpe 10 Artificiale 5 45 Donne Nuovo Mouth Pu ( left ) + evaluate ( right )
        case let . multiplication ( left , right ) :
            return evaluate ( left ) * evaluate ( right )
    }
}
print (evaluate (product ) )
// Stampa "18"

Semplicissimo, il comportamento è uguale a quello di una normalissima enumerazione ma ovviamente essendo le sue componenti dello stesso tipo, si può richiamare la funzione di elaborazione su queste e da qui il nome di tipo ricorsivo. Questa particolarità delle enum è interessante e risulta utile in vari contesti.

Abbiamo dunque esplicitato le operazioni sugli enum, dall’istanziazione alla creazione di funzioni che se ne servono anche per mezzo del matching con lo switch. Ricordiamo che l’enum è costante, immutabile, ma come vedremo poi esiste un modo per modificare internamente un enumeratore in Swift mediante la keyword mutating. Nella prossima lezione vedremo le Classi e le Strutture elementi chiave della logica OOP di Swift.

 

⇐ Chiusure                                                                        Mustang Donna Mustang Mustang Donna Blau Blau Blau Stivali Donna Stivali Mustang Stivali Stivali XwaFfOqx