0 of 18 lessons complete (0%)
Swift Tour: Le basi

Gli array del linguaggio Swift | Le collezioni di elementi

This is a preview lesson
Purchase this course, or sign in if you’re already enrolled, to take this lesson.

Dimmi un po’, sei mai salito su un treno? Perché averlo fatto ti aiuterà a capire gli array del linguaggio Swift.
(e se non lo hai fatto, ci sono io per questo 😂).

Sappiamo, dalle lezioni precedenti, che grazie alle variabili e costanti possiamo conservare valori al loro interno come se fossero delle scatole.

Il loro problema, però, è che permettono l’inserimento di un singolo valore. Quindi, quando vogliamo metterne un altro, dobbiamo obbligatoriamente togliere il precedente (parliamo solo di var perché le let sono immutabili).

In realtà il problema non è strettamente legato alla var/let, bensì ai tipi di dato che abbiamo visto fino a questo momento.

Peppe, esiste un tipo di dato del linguaggio Swift che permette di raggruppare più valori?

Il type che mette a disposizione il linguaggio Swift si chiama Array.

Un Array è un insieme di valori che possono essere conservati, tutti, all’interno di una singola var/let.

Ora, prima di cominciare a scendere nei dettagli, ti facevo l’esempio del treno. Un array si comporta esattamente come un treno.

  1. Un treno è composto da vagoni.
  2. Un vagone contiene delle informazione (persone, merci etc).
  3. Ogni vagone ha un identificativo che ci permette di capire dove andare a sederci.

Allo stesso modo gli array hanno degli slot che, grazie ad un identificativo o indice (un numero intero), ci permetteranno di conservare e recuperare le informazioni.

Gli array si riempiono partendo dal primo vagone che ha indice 0. Ed ogni volta che vorremo aggiungere un altro elemento, aumenteremo l’indice e quindi creeremo un nuovo vagone.

Capita la teoria? (In caso scrivimi un commento sotto)

Vediamo insieme come utilizzare gli array del linguaggio Swift 💪

Creare un array

Un array è un tipo di dato. Questo significa che possiamo mettere dopo la keyword var/let, il nome ed i due punti, il Type che lo rappresenta.

Per gli array, questo Type, è definito da:

  1. Un blocco di parentesi quadre []
  2. Dentro le quadre il tipo di dato dei dati che dovrà contenere
    1. Esempio: [Int] (array di Int) oppure [String] (array di String)

Quindi, le parentesi quadre fanno capire al Playground ed Xcode che stiamo per creare un array. Mentre il type messo all’interno fa capire quali saranno i dati che metteremo al suo interno.

Facciamo un esempio.

Ipotizziamo di voler creare una lista della spesa. Gli elementi da acquistare li rappresenteremo con delle stringhe.

perché String? perché quando li metteremo dentro un’app le String sono il tipo di riferimento dell’oggetto grafico che rappresenta un testo.

Quindi, dichiariamo una var di tipo [String]:

var lista: [String]

Per passare un valore alla lista, devi usare sempre l’operazione di assegnazione, quindi il simbolo = e la sintassi da usare è:

  1. Parentesi quadre
  2. All’interno delle quadre un valore. Se sono di più, devono essere divisi da una virgola.

Se le parentesi quadre non hanno valori al loro interno, creerai un array vuoto.

Quindi:

var lista: [String] = [] // lista è un array vuoto - un treno senza vagoni ma con la solo locomotiva 
lista = ["Pasta", "Carne", "Biscotti", "Involtini di pollo"] // assegno un array con 4 valori 

Cosa succede se stampiamo lista?

print(lista)
//["Pasta", "Carne", "Biscotti", "Involtini di pollo"]

In console compare tutto l’array. Perché tutto?

Perché ti ricordo che la variabile contiene tutto l’array (è l’array). Un po’ come se fosse tutto l’intero treno.

Come si accede ai valori dell’array?

Accedere ai valori di un array

La sintassi da utilizzare per leggere i valori di un array del linguaggio Swift è molto semplice.

Ti raccontavo che ogni vagone ha un indice. Quindi, ogni elemento all’interno dell’array può essere recuperato conoscendo l’indice.

Gli indici o index di un array partono dal numero intero 0. Questo significa che il primo vagone, cioè il primo valore, si trova all’indice 0. Il secondo ad index 1 e così via.

Lo voglio sottolineare con più incisione.

Gli indici partono da zero 0 ZERO. Zero!

Quindi, se ti chiedo di recuperare il 3 elemento, che indice dovrò usare?

Non ti fare fregare perché all’inizio è facilissimo sbagliare 😂

Ora, veniamo alla pratica.

Per accedere ad un elemento la sintassi da utilizzare è:

  1. Nome dell’array seguito da parentesi quadre
  2. Dentro le quadre l’indice da utilizzare
lista = ["Pasta", "Carne", "Biscotti", "Involtini di pollo"]
lista[0] // Pasta
lista[1] // Carne
lista[2] // Biscotti
lista[3] // Involtini 
lista[4] // ERRORE!

Accedere ad un elemento dell’array che non esiste manderà in crash l’applicazione. Quindi presta molta attenzione.

Questo errore si chiama Index out or Range

Prima di vedere cosa possiamo fare con questo accesso, vediamo un’altra sintassi.

Dato che puoi passare un numero intero dentro le quadre, in certe circostanze potresti avere una var/let che definisce l’index:

let index = 2
array[index]

Infine, nessuno ti vieta di passare il valore recuperato all’interno di un’altra var/let:

let messages: [String] = ["Ciao", "come va?", "Ti volevo racontare una cosa"]
let firstMessage = messages[0] 

Esercizio: Di che tipo di dato è firstMessage?

Modificare un array

Partiamo dal problema ed arriviamo alla soluzione. Utilizziamo l’array messages e proviamo a modificare il firstMessage (ricordati di trasformarla in var):

let messages: [String] = ["Ciao", "come va?", "Ti volevo racontare una cosa"]
var firstMessage = messages[0]
firstMessage = "Ehilà!!!"
print(messages)

L’esempio potrebbe riguardare una funzionalità di una chat come Telegram (P.S. ti ricordo abbiamo un canale) dove si da la possibilità di modificare i messaggi.

Perché il primo elemento non è stato modificato?

Se ti ricordi, in una lezione precedente, ti ho detto che i tipi di dato si dividono in value type e reference type.

Le String, che sono il type che abbiamo inserito dentro l’array, sono value type. Questo significa che quando passiamo i valori ad altre var, li stiamo clonando.

In pratica, firstMessage e messages[0] sono due entità, due oggetti, diversi pur se contengono lo stesso valore.

Come fare allora?

Devi modificare direttamente l’elemento in posizione X, senza far scambi di valore (a meno che non stai usando tipi di tipo Reference).

let i = 0
messages[i] = "Ehilà!!" // oppure messages[0]
print(messages)

Questa sintassi puoi leggerla così: Assegna un nuovo valore all’elemento in posizione 0 dell’array messages.

Esercizio. Prova a scambiare gli elementi in posizione 0 ed 1. Non fare la furbata di scrivere messages[0] = “etc etc”, ma usa le sintassi viste poco fa. In caso di problemi o vuoi condividere la soluzione, scrivimi sotto.

Metodi e proprietà degli array

Sappiamo che i tipi di dato del linguaggio Swift offrono dei metodi e proprietà. Nel caso degli array questi sono veramente utilissimi.

Vediamo insieme alcuni.

count

La proprietà count restituisce il numero intero di elementi presenti all’interno dell’array (avevamo incontrato il count con le stringhe).

let points: [Int] = [2404, 1999, 9999, 1, 100]
let count = points.count // 5
print(points.count)

Dove può esserci utile il metodo count?

Grazie al count possiamo evitare di andare in errore Index out of Range che si verifica quando stiamo provando ad accedere o modificare ad un elemento in posizione index non presente.

Come?

Utilizzando anche l’istruzione if-else.

Faccio l’esempio modificando un elemento da un array. Gioca con il valore di index per capire cosa succede in tutti i casi:

var array = ["Pasta", "Carne", "Piatti e Bicchieri"]
let count: Int = array.count // 3
let index: Int = 3 // cambia questo valore per i test
if (index >= count || count < 0) {
   print("operazione non permessa: i: \(index) - c: \(count)")
} else {
   array[index] = "Pop Corn"
}
  1. Perché index >= count?
    count restituisce il numero di elementi, nell’esempio 3. Se index è 3 vuol dire che stiamo provando ad accedere al quarto elemento che non esiste. Quindi index deve sempre essere minore di count.
  2. Perché count < 0?
    Gli indici non possono mai essere negativi.

Tutto chiaro? In caso scrivimi un commento in fondo alla lezione.

Prima di vedere un altro metodo, ti lascio un suggerimento.

La modifica, nell’esempio, l’abbiamo inserita all’interno dell’else. Dato che è l’operazione importante andrebbe messa all’interno del blocco if (per questione stilistica e perché tendenzialmente è la prima cosa che si guarda).

Il nostro codice diventerebbe così:

if (index < count && index >= 0) {
    array[index] = "Pop Corn"
}

Append

Il metodo append, come per le String, permette di aggiungere un nuovo elemento in coda all’array.

Quindi, la sintassi da utilizzare è la seguente:

var users: [String] = ["Giuseppe", "Matteo", "Luca"]
users.append("Antonio")
users.append("Francesco")

questo metodo può essere utilissimo quando si ha a che fare con delle sequenze di dati inseriti da un utente (messaggi, informazioni, contatti etc)

insert

Simile all’append, il metodo insert(<valore>, at: Int) permette di inserire un elemento in una posizione ben definita.

users.insert("Ronaldo", at: 0)

Il primo parametro è il nuovo elemento da inserire e dipende dal tipo di dato dell’array. Mentre, il secondo è la posizione quindi l’indice in cui inserirlo.

Cosa succede se già c’è un elemento?

Questi vengono traslati. Quindi il precedente passa in posizione successiva.

contains

Il metodo contains restituisce un booleano (true/false) se l’elemento cercato è presente o meno nell’array.

let a1: [Int] = [-193, 99, 0, 560, 69, 7]
let res1: Bool = a1.contains(560) // true
a1.contains(-99) // false

Esercizio. Guarda il codice che segue. Cosa restituisce il metodo contains e perché?

let a2: [String] = ["Ciao, come stai?", "Tutto bene", "OK"]
a2.contains("ok") // cosa restituisce e perché?

Conclusione

Abbiamo visto che gli array del linguaggio Swift sono dei particolari contenitori. Questi, ti assicuro, li utilizzerai praticamente in tutte le applicazioni che creerai.

Sono utili per creare feed di notizie, feed di informazioni. Pagine di settings, classifiche etc etc.

Ovunque c’è bisogno di tenere insieme dei dati, gli array potranno aiutarti.

Nella prossima lezione vedremo un altro tipo di dato che permette di creare collezioni. Si chiama Dictionary ed è una sorta di array evoluto.

Per il resto, qualsiasi dubbio o curiosità, scrivimi pure un commento sotto.

Buona programmazione!