Da bambino mi dicevano sempre che non potevo sommare patate con cipolle, ma solamente patate con patate e cipolle con cipolle.
Per fortuna, ogni tanto, stavo attento a scuola 😂
Perché, oggi, questa regola mi servirà per spiegarti uno degli argomenti cardine dello sviluppo: I tipi di Dato del linguaggio Swift (si applica anche ad altri linguaggi).
Partiamo da qui: Quanto fa la somma tra 2 patate e 3 cipolle?
Di certo non fa 5 patacipolle.
Però qualcuno potrebbe dire: “Materialmente potresti prendere quegli elementi e metterli dentro un sacchetto“. In questo modo, però, non avrei un sacchetto di 5 cipolle o patate ma avrei una busta con 5 pezzi di ortaggi.
Per l’informatica, questo gioco d’astrazione, non è così scontato ed immediato (anche se poi vedremo un sistema che ci permetterà di farlo).
Cioè, per riportarti con i piedi nel mondo dello sviluppo app, se ho una variabile che contiene 2 bottoni ed un’altra variabile che contiene 3 immagini, queste due non potrò sommarle tra loro.
Quindi, di base, il linguaggio Swift ci permette di eseguire operazioni solamente tra elementi che appartengono allo stesso tipo.
Ma che vuol dire elementi che appartengono allo stesso tipo?
Vediamolo insieme!
Type Safe
Ogni fruttivendolo che si rispetti, dentro il suo locale, ha una distesa enorme di patate (capisci a me 😅). In mezzo a quella distesa troviamo patate Novelle, a buccia Gialla…
Patate di tipo differente, cioè che appartengono a diverse sotto famiglie, ma che sai comunque riconoscere come Patate.
Quindi pur non essendo un agronomo, se ti mettono di fronte una patata ed una cipolla dovresti essere in grado di riconoscere a che tipologia di ortaggio appartengono.
Questa proprietà, l’appartenza di un elemento specifico ad una famiglia più generale, nei linguaggi di programmazione, prende il nome di Type Safe.
Un linguaggio è Type Safe quando permette operazioni tra elementi della stessa famiglia.
E neanche a dirlo, il linguaggio Swift è Type Safe.
Peppe, ma quali sono e come faccio a riconoscere le famiglie de linguaggio Swift?
Apri il Playground così da vederlo praticamente.

Tipo di Dato
Premessa: da qui in avanti utilizzerò il nome “Tipo di Dato”, “Type” o “Famiglia” per descrivere lo stesso concetto.
Ora, guarda queste due costanti:
let nome = "Giuseppe Sapienza"
let età = 25
A colpo d’occhio, per quello che ci siamo detti prima, il contenuto di “nome” ed “età” non sono uguali di tipologia quindi appartengono a due famiglie o tipi di dato differenti (uno è un testo e l’altro un numero).
Ed infatti, i testi ed i numeri appartengono a due type diversi:
- I testi vengono descritti dalla famiglia delle String.
- I numeri interi, cioè senza virgola positivi o negativi, dal type Int.
let nome = "Giuseppe Sapienza" // String
let età = 25 // Int
Più in generale, tutti i valori che utilizzerai avranno sempre un Tipo di Dato di riferimento, cioè un insieme che contiene e descrive i possibili valori.
Il type safe in azione
Una volta passato un valore, che appartiene ad un tipo, la costante o variabile potrà contenere valori solamente di quel type (ovviamente il discorso si applicherà solo alle var dato che le let non potranno essere modificate).
Ed infatti, se provi a passare un valore di un type diverso, come un Int, ad una variabile String ti comparirà un errore che non ti farà eseguire il codice (lo stesso viceversa):

L’errore è: “Cannot assign value of type Int to type String“. Da notare come il problema non riguarda il valore 25. Bensì ti sta dicendo che nessun Int, ovvero nessun numero Intero, potrà mai essere passato ad una variabile che contiene type String.
Se var e let ti suonano nuove, ho spiegato queste nozioni nella lezione delle variabili e costanti del linguaggio Swift.
Dichiarazione Esplicita
Una variabile assorbe il tipo in due modi:
- Implicitamente dal valore che gli assegni nel momento della sua creazione
- Esplicitamente, cioè definendo il tipo prima del passaggio del valore
La prima tipologia è quella che abbiamo usato fin ora. Mentre la seconda viene fuori dall’utilizzo di un nuovo pattern per la creazione delle variabili e costanti.
Per dichiarare esplicitamente il tipo di una variabile devi scrivere:
var nomeVar: NomeTipo
Keyword, var o let, e poi l’etichetta. A seguire, devi aggiungere i due punti ed il nome del Tipo di dato (esempio Int):
var name: String
Grazie al “: NomeTipo” il compilatore capisce che stai creando una var/let che potrà contenere solamente un tipo ben definito di valori.
La dichiarazione esplicita, in più, ti evita l’assegnazione di un valore di default.
Attenzione però!
Aggiungendo i due punti, che puoi mettere attaccati o staccati all’etichetta, ed il type non viene più segnalato il problema di “missing in pattern“. Quindi puoi eseguire il codice senza che venga generato un errore.
Questo porta con se una complicazione non banale. Se adesso provi ad utilizzare la variabile, Xcode ed il Playground, ti segnaleranno un problema.

L’errore è: Variable ‘name’ used before being initialized. Stai provando ad utilizzare una variabile prima della sua inizializzazione.
L’inizializzazione deve sempre avvenire prima dell’utilizzo. Altrimenti l’app andrà in crash.
Quindi puoi risolvere il problema mettendo l’assegnazione nel momento stesso della dichiarazione:
var a: Int = 0 // dichiarazione di tipo esplicito + assegnazione
Domanda da un milione di dollari, perché allora si usa la dichiarazione esplicita?
- Per avere un ordine mentale e del codice. Spesso capiterà di avere centinaia di righe di codice e sapere il tipo di una var senza doverlo capire dal valore aiuterà sopratutto te a capire cosa hai o avevi scritto.
- In alcune procedure, che vedremo tra un po’, è obbligatoria questa sintassi.

Io, spesso e volentieri, utilizzo sempre la dichiarazione esplicita. Mantiene il mio codice più leggibile ed in ordine.
Capita l’importanza dei Tipi di Dato, dell’assegnazione, della dichiarazione implicita ed esplicita, vediamo quali sono gli altri Type del linguaggio Swift (i più importanti).
Int
L’abbiamo già incontrato ma è giusto riprenderlo per fare il punto della situazione.
Int è il type, cioè l’insieme o famiglia, dei numeri Interi. I numeri interi sono quelli positivi o negativi, senza la virgola. L’insieme ha un limite, cioè non puoi sforare un numero massimo o minimo:
let max_int: Int = 9223372036854775807
let min_int: Int = -9223372036854775808
Il min e max della famiglia Int dipende dall’architettura del dispositivo.
Se è a 64 bit il confine è dato dai valori sopracitati, altrimenti a 32 il massimo e min è nettamente inferiore (tutti gli ultimi dispositivi iOS sono a 64bit).
Overflow
Curiosità! 🤔 Sforare il limite significa andare in Overflow, eccesso, ed ovviamente manderà in crash l’applicazione (difficilmente andrai in overflow. Però è giusto metterti a conoscenza di questo termine).
Tra le altre cose, la parola Overflow è anche quello che ha dato vita al sito StackOverflow che è la bibbia della programmazione.
È un sito in cui si fanno delle domande e si ottengono delle risposte a tutti, e dico tutti, i problemi che incontrerai nella programmazione.
Double
Per quanto riguarda i numeri con la virgola?
Il type di riferimento è il Double. Per scrivere un numero in virgola si utilizza la sintassi anglosassona.
Quindi si mette un punto tra la parte intera e decimale.
Di default tutti i numeri in virgola vengono considerati Double, quindi se non usi la dichiarazione esplicita la var/let sarà di type Double:
var a = 4.5 // implicitamente a è un Double let b: Double = -5.982
Domanda. Cosa accede se mettono un numero Int ad una var dichiarata esplicitamente come Double?
let x: Double = 1 // OMMIODIO!! CHE SUCCEDE QUI???
Fai questa prova e rispondimi per commento in fondo alla pagina 😎
Float
Esiste un’altra famiglia che descrive i numeri in virgola, il Float. Lo so, ti farà uscire pazzi questa cosa ma c’è un motivo.
var a1: Float = 4.66 // DAVVERO??
Per usare i Float dobbiamo dichiarare esplicitamente la var/let come Float. Altrimenti, come ti dicevo prima, i numeri in virgola saranno sempre dei Double.
Qual è la differenza?
L’unica differenza è la precisione dopo la virgola. Un Float è meno preciso di un Double. Cioè possono starci meno numeri dopo la virgola. Ti faccio vedere così si capisce meglio:

Pur avendo messo lo stesso numero, nel momento dell’utilizzo, il Float si ferma a considerare solamente le prime 7 cifre dopo la virgola mentre il Double più del doppio.
Curiosità! 🤔 Il Double, storicamente, veniva usato per le operazioni che richiedevano molta precisione (esempio calcoli matematici o fisici per esperimenti) mentre il Float per tutto il resto.
Oltre a questo motivo, all’origine, era importante risparmiare risorse (la memoria era limitata). Quindi si creerano questi due tipi per permettere allo sviluppatore di ottimizzare le risorse. Oggi non ce n’è più di bisogno e di fatto il Double è diventato il default (prima era il contrario).
String
Il type String descrive i testi. I testi vengono definiti utilizzando le doppie virgolette. Qualsiasi cosa c’è al loro interno verrà considerata come testo (emoji, numeri, caratteri speciali…):
let name: String = "Giuseppe Sapienza"
let età: String = "25"
var text = "Ciao, oggi è il 3 Settembre"
Lo abbiamo ampiamente usato nelle precedenti lezioni, quindi non aggiungo nient’altro.
Bool
Bool de che?
È un particolare insieme composto solamente da due valori.
Un valore che rappresenta la condizione true (vero) ed una quella di false (falso). Un valore di tipo Bool viene chiamato booleano:
var isOn: Bool = true
var isDeath: Bool = false
isOn = false
isDeath = true
Si usa quando si ha bisogno di un controllo stringente.
Esempio. “la luce è spenta o accesa?”, “Il personaggio è morto o vivo?”, “ha eseguito il login o no?”. Tutte condizioni in cui basta un valore true o false per esprimere il concetto.
Curiosità! 🤔 Bool prende il nome dal metematico George Boole creatore dell’algebra booleana. Viene considerato da molti come precursore dell’informatica.
Considerazioni
Scusa se sono stato un po’ prolisso e poco pratico ma è di fondamentale importanza capire questi concetti.
Se hai commesso l’errore di saltar pier pari questa lezione, quindi probabilmente non stai leggendo neanche qui, ti ritroverai nei guai perché ti mancherà il filo logico che lega tutta la programmazione 😅.
I tipi di dato sono il cuore della programmazione moderna.
Oggi ti ho fatto vedere quelli fondamentali, ne esistono altri e ne potremo creare di nostri. Vedrai, tra un paio di lezioni, che oltre a descrivere valori forniscono anche delle funzionalità che ci aiuteranno a risolvere dei problemi con semplicità.
Ma questa è un’altra storia.
Al solito, se hai avuto problemi o vuoi scambiare quattro chiacchere, scrivimi pure un commento.
Buona programmazione!