Quando andavo al liceo non pensavo che i dizionari mi sarebbero tornati utili anche nella programmazione 😂
I dizionari del linguaggio Swift sono una particolare collezione che permette di associare ad una chiave (key) dei valori (values).
Proprio come un vero vocabolario le informazioni vengono organizzate da noi sviluppatori seguendo un criterio.
Esempio?
Immaginiamo di voler creare un’app che ci permetta di cercare i comuni d’Italia. Potremmo usare un array e quindi mettere tutto dentro un’unica collezione, oppure potremmo utilizzare un dictionary.
In questo caso organizzeremmo i valori in base alla loro prima lettera. Quindi, tutti i comuni che cominciano per “A” associati alla chiave “A”, quelli per “B” sulla chiave “B” e così via.
Se hai capito gli array, visti nella lezione precedente, ti assicuro che anche i dizionari saranno un gioco da ragazzi.
Vediamoli insieme!
Creare un dizionario
La prima cosa da fare quando ci approcciamo ai dizionari del linguaggio Swift è capire il suo tipo di dato e come si definisce.
Tutto parte dalle parentesi quadre come gli array, al suo interno però il tipo di dato deve essere così definito: [ TipoChiave : TipoValore ]
Questo vuol dire che un dictionary in Swift è un particolare array dove all’interno i dati vengono inseriti a coppia. Una Key ed un Value.
- Key: può essere solamente un valore. Deve essere unico all’interno del dizionario e generalmente si utilizzano String o Int.
- I due punti fanno capire che stiamo creando un dizionario.
- Value: può essere uno o più valori.
Facciamo degli esempi:
let dictionary: [String : String] // chiave String - valore String
let dictionary2: [Int : String]
let dictionary3: [String : Int]
let dictionary4: [String : [String]] // String - valori array di String
Vediamo adesso come utilizzarlo.
Per inizializzare un dizionario del linguaggio Swift, la sintassi da utilizzare è la seguente:
var dictionary: [String : String] = [:]
// oppure
var dictionary2 = [String : String]()
Invece, per passare valori al suo interno, bisogna guardare il suo tipo di dato per poi passare i valori sempre a coppia:
var dictionary: [String : String] = ["A" : "Antonio"]
Se volessi aggiungere più valori mi basterebbe mettere una virgola ed aggiungere un’altra coppia:
var dictionary: [String : String] = ["A" : "Acireale", "P" : "Pedara"]
Quando ho più valori da inserire dentro il dizionario, generalmente la sintassi che utilizzo è la seguente:
var dictionary: [String : String] = [
"A" : "Acireale",
"P" : "Pedara"
]
Così è anche più immediato da capire e sistemare.
Aggiungere una coppia che ha una chiave già esistente manda in Crash l’applicazione con un Fatal Error.
Esercizio. Cosa vedi in console stampando la let messages? e perché?
let messages: [Int : String] = [
0 : "Ciao!",
1 : "Come stai?"
]
print(messages)
AAA. Il print di un dizionario e l’accesso ai valori è disordinato quindi non viene rispettato l’ordine definito durante la creazione.
Accedere ai valori
Per accedere ai valori di un dizionario in Swift bisogna utilizzare la stessa sintassi degli array. Specificando, al posto dell’indice, la chiave a cui vogliamo accedere:
let comuni: [
"P" : "Pedara",
"A" : "Acireale"
]
let a = comuni["A"] // Acireale
comuni["P"]
Se le chiavi fossero state di tipo Int, il risultato sarebbe stato pressoché identico ad un array:
let messages: [Int : String] = [
0 : "Ciao!",
1 : "Come stai?"
]
let firstMessage = messages[0] // "Ciao!"
Cosa succede se stampo firstMessage?
In console compare il valore circondato dalla dicitura Optional(“Ciao”). Se analizzi il type del firstMessage noterai che non è di tipo String come si aspettavamo ma di tipo String?
Questo tipi di dato, che si chiama Optional, lo impareremo ad utilizzare nella prossima lezione.
Intanto, per me, era fondamentale farti vedere la sintassi d’accesso ai valori di un dizionario del linguaggio Swift.
Modificare i valori
Per modificare un valore del dizionario, devi prima accedere allo slot, specificando la chiave, e poi puoi passargli un nuovo valore:
var stipendi: [String : Int] = [
"Giuseppe" : 2000,
"Luca" : 7000
]
stipendi["Giuseppe"] = 12000
Per non essere ripetitivo, ti ricordo il discorso fatto sulla modifica degli Array. Anche in questo caso i valori sono di tipo Value Type quindi devi accedere direttamente al dizionario.
Dictionary di Array
All’inizio della lezione ti ho fatto l’esempio di un dizionario di comuni. Per poterlo creare, dobbiamo associare alla Key un Array di valori.
Quindi diventerebbe:
var comuni: [ String : [String] ] = [
"A" : ["Acireale", "Ancona", "Avellino", "Arezzo"],
"B" : ["Bologna" , "Belpasso", "Benevento", "Bari"],
"C" : ["Catania", "Como", "Cremona"]
]
Di conseguenza, se provo ad accedere alla chiave “A” recuperò tutto l’array associato:
let arrayComuniA = comuni["A"]
print(arrayComuniA)
Dato che c’è sempre quel problema legato al type Optional. Per il momento fermiamoci qui e continuiamo analizzando i metodi e proprietà dei dizionari del linguaggio Swift.
Il Type Optional lo studieremo nella prossima lezione.
Metodi e proprietà
Essendo il Dictionary di Swift un tipo di dato, anche questo ha dei metodi e proprietà che possiamo utilizzare per facilitare alcuni compiti.
Vediamone alcuni!
isEmpty
Come per gli Array per le String, l’isEmpty restituisce un Bool se il dizionario è pieno oppure vuoto.
Per essere vuoto, il dictionary non deve contenere nessuna chiave-valore:
var descriptionComuni: [String : String] = [:]
descriptionComuni.isEmpty // true
descriptionComuni["Catania"] = "Catania è un comune alle pendici dell'Etna..."
descriptionComuni.isEmpty // false
count
La proprietà count restituisce il numero Int di elementi del dictionary inteso come coppia di chiave-valore.
let points: [Int : Double] = [
0 : 166.99, // la key potrebbe essere l'ID dell'utente
1 : 500.50,
123 : 0.70
]
let players = points.count // 3 perché ci sono tre keys
updateValue
Il metodo updateValue(<valore>, forKey: <chiave>) permette di aggiornare o aggiungere un valore ad una chiave definita.
points.updateValue(900, forKey: 0) // aggiorna 0
points.updateValue(0, forKey: 2) // aggiorna 2
Esercizio. Prova ad aggiornare i valori della chiave “C” del dizionario di comuni.
Solo per senso di completezza, il metodo updateValue oltre a modificare restituisce il vecchio valore modificato (se presente).
let oldValue = points.updateValue(1000, 0)
print(oldValue)
Conclusione
Con i dizionari del linguaggio Swift abbiamo quasi finito il ciclo relativo ai type standard maggiormente utilizzati in questo linguaggio.
Ne manca solamente uno, che è l’Optional, che abbiamo visto saltar fuori in alcune parti di questa lezione.
Studieremo il Type Optional nella prossima lezione.
Per il resto, qualsiasi dubbio, problema o curiosità, scrivimi pure un commento in fondo alla lezione.
P.S. Se non lo hai ancora fatto, seguimi su Youtube dove pubblico nuovi tutorial su Swift e sviluppo di app.
Buona Programmazione!