Compatibile con Xcode 8

Variabili e Costanti in Swift. I migliori amici di un #Dev

Tutto si può conservare. I soldi (chi li ha), gli alimenti, gli indumenti e le idee.

Tutte le applicazioni conservano informazioni. Che siano posizioni geografiche, testo o contatti telefonici. In qualsiasi app c’è un sistema che ti permette di conservare i dati che generi. Il punteggio di un gioco viene memorizzato dall’app, i tuoi contatti vengono salvati sul cloud, le tue ricette preferite pure e la lista è potenzialmente infinita.

Ma da futuro sviluppatore devi andare oltre.

Comincia a chiederti: com’è che funziona? Dove vanno a finire i dati che inserisco dentro un campo di testo? Come vengono gestiti con il linguaggio Swift?

Non è tanto banale come domanda. La “conservazione” non è tanto intuitiva come lo è nella realtà.

In genere quando si parla di conservazione nella realtà, oltre all’oggetto in sé che si vuole mettere da parte, si pensa anche allo spazio in cui lasciare le varie cose. I soldi vanno nei salvadanai, il cibo nella dispensa e i cd rom – chi è che ancora li usa? – negli appositi scaffali.

Dall’altro lato, il digitale nasconde le meccaniche con cui i dati vengono salvati. Abbiamo semplicemente una percezione di un sistema simile alla realtà che è portato all’estremo dalla grafica intuitiva dei sistemi operativi e applicazioni. Le cartelle, per esempio, emulano quello che le scatole rappresentano nella vita quotidiana.

Ecco perché è importante partire da qui, dalla conservazione.

Tu imparerai a gestire i primi dati, le prime informazioni, utilizzando il componente più elementare e di base che il linguaggio Swift mette a disposizione: le variabili e costanti.

Le variabili e costanti in Swift sono il tuo punto di partenza verso il fantastico mondo dello sviluppo applicazioni.

Quindi, bando alle ciance, sei pronto a scendere nelle profondità del linguaggio?
Allora diamo uno sguardo alle variabili e costanti in Swift!

La memoria di un dispositivo. Dove tutto comincia e finisce

Oggi, quasi tutti, sappiamo che un computer, che sia un Mac o un iPhone, è dotato di un qualcosa chiamato Memoria (mi fermo qua perché non basterebbe un corso per spiegare cos’è e come funziona). La memoria di un computer puoi immaginarla come divisa in tanti blocchi o righe. Più o meno come un foglio a righe.

Ogni blocco, inoltre, è dotato di un indirizzo dal quale si risale facilmente al blocco di memoria.

Memoria dispositivo iOS var e let swift

All’interno di ogni blocco verrà conservata un’informazione. Una foto, un video, un numero, una parola, l’applicazione stessa viene immagazzinata all’interno di un blocco di memoria.

Fortunatamente, con il linguaggio Swift non ti spingerai mai fino ai meandri oscuri della memoria così come te l’ho descritta. Cioè non ti preoccuperai mai di andare ad inserire i dati in una di queste celle e indirizzi di memoria (cosa che per esempio accade con il linguaggio C).

Grazie al linguaggio Swift ti basterà chiedere: “Ehi iPhone, devi conservarmi un’informazione, non mi interessa dove la vai ad infilare – ogni doppio senso è puramente casuale – l’importante è che la salvi”. Una volta fatta la richiesta, il tuo iPhone penserà a tutto il resto.

Ma come faccio a chiedere al mio iPhone di memorizzare un’informazione?

Le Keywords. Come comunicare con il dispositivo

Tutto parte dalle domande. Domandare con il linguaggio Swift è già qualcosa che hai visto nella lezione precedente, quando sei riuscito a stampare su console una scritta utilizzando la parola print.

Già quel semplice esempio dovrebbe farti intuire come esistano altre parole che ordinano al dispositivo di eseguire delle azioni. Queste parole o comandi prendono il nome di Keywords.

Quando parli con un’altra persona, questa è in grado di associare le parole (Keywords) che pronunci ad un significato ben definito. Infatti non hai bisogno di dovergli spiegare il significato delle parole stesse (perché presumi che, da adulto, conosca già la lingua italiana).

Parlare con un computer è pressoché la stessa cosa. Per farlo devi iniziare a conoscere quali sono le parole o keywords da utilizzare.

Ti faccio un esempio.

  • Giuseppe: “Ciao Marco, prendi quelle due mele!”

Marco non avrà bisogno di chiedere cosa deve fare (“prendi”), cosa sono le mele o cosa significa “due” perché, si presume, sa già associare ogni parola al suo significato. Sa che due è un numero, che mela è un oggetto e che ha il compito di prenderle.

Per farla breve, Il linguaggio di programmazione Swift ha una sfilza di parole che il compilatore riuscirà ad interpretare senza necessitare di una spiegazione.

Queste parole, che chiamerai keywords o parole chiave, formano il vocabolario di base del linguaggio Swift.

Le prime keyword di Swift: var e let

Le parole che utilizzerai in questa lezione si chiamano: var e let. Vengono anche dette variabili e costanti del linguaggio Swift. Entrambe permettono la conservazione delle informazioni ed entrambe sono due modi differenti di affrontare il problema del salvataggio dei dati.

Come ti dicevo non ti preoccuperai di come il linguaggio gestisce la memoria, cioè gli indirizzi o le celle di cui ti parlavo poc’anzi, perché ci penseranno queste due semplici keyword. Nel particolare:

  • var: Il contenuto conservato in una var o variabile può cambiare nel tempo. Per esempio, il punteggio di un giocatore è qualcosa che cambia in base ai livelli ed al tipo di gioco a cui si sta giocando.
  • let: Il contenuto conservato una let o costante non può cambiare nel tempo. Per esempio, il tuo codice fiscale o la tua data di nascita sono informazioni che non varieranno mai nel tempo e quindi, è consigliabile, salvare all’interno di una let/costante.

variabili e costanti del linguaggio swift

Se hai capito la teoria., la pratica sarà un gioco da ragazzi. Vediamo insieme come utilizzare le variabili e costanti in Swift.

Variabile con il linguaggio Swift

Prima ti ho detto che la conservazione di un’informazione avviene tramite l’utilizzo delle variabili e costanti. Adesso ti dico che una variabile, per il linguaggio Swift, si definisce tale se il suo valore può cambiare nel tempo.

Una variabile, o var in Swift, è come un cassetto del tuo armadio. Puoi aprirlo, cambiare e togliere le magliette.

Nel linguaggio di programmazione Swift, per poter implementare una variabile, si utilizza la keyword var (var-iabile) seguita dal nome che vuoi dare alla variabile:

Il processo di conservazione di un’informazione all’interno di una variabile si chiama assegnazione.

Per assegnare un valore ad una variabile si utilizza il simbolo = (uguale). In informatica il simbolo uguale sta a indicare che il valore a destra dell’uguale sarà contenuto nella variabile a sinistra dell’uguale.

Il simbolo d’uguaglianza assegna l’informazione alla sua destra ad uno spazio di memoria (cioè alla variabile).

Quindi assegnare significa: “Ehi! Vammi a conservare questo valore in uno spazio di memoria”.

Per questo motivo, il simbolo matematico d’uguaglianza ha significato completamente diverso rispetto a quando viene utilizzato in informatica. In matematica significa che il valore a sinistra dell’uguale è identico a quello di destra. Ad esempio “x = 2” equivale a dire che “2 = 2” e infine “0 = 0”.

Apri il Playground, crea la tua prima variabile e assegnagli un valore:

Come viene eseguito il codice?

  • Il compilatore scorre le righe partendo dalla numero 1 e si ferma appena trova un codice.
  • Vede, come prima cosa, che hai utilizzato la parola chiave var.
  • Capisce che hai dichiarato una variabile di nome laMiaVariabile.
  • Vede che stai eseguendo un’assegnazione dato che c’è il simbolo =. Assegna il valore di destra alla variabile.
  • Il compilatore passa alla riga 2.
  • Legge print e capisce che dovrà scrivere qualcosa in console.
  • Prende il valore assegnato alla laMiaVariabile.
  • Stampa il valore.

Assegnare un valore ad una variabile rende quest’ultima paragonabile ad un contenitore.

Immagina la variabile come un’enorme scatola la quale all’esterno ha attaccata un’etichetta che ne rappresenta il nome. Con il simbolo uguale non fai altro che dire: “Metti il valore a destra dell’uguale all’interno della scatola”.

Creare una variabile con il linguaggio swift

Costante con il linguaggio Swift

Una costante, a differenza della variabile, una volta assegnatogli un valore non lo cambierà più per tutta la vita dell’applicazione. Ti ricordi la scatola? Bene, in questo caso, una volta che è stata riempita, viene immediatamente chiusa. Una volta chiusa non è possibile inserire o cambiare il suo contenuto.

Per creare una costante utilizza la keyword let:

Aggiungi il codice immediatamente sotto a quello scritto per la variabile.

Commentare il codice

Spesso ti capiterà di non ricordarti cosa significa un determinato codice che hai scritto, in aiuto Swift ti mette a disposizione l’utilizzo dei commenti.

I commenti non vengono letti dal compilatore quindi non preoccuparti, nessuno saprà della loro esistenza!

  • Per scrivere un commento in una linea utilizza // prima del commento.
  • Per scrivere un commento multi linee devi utilizzare /* prima dell’inizio del commento e */ alla fine del commento.
Se hai provato il codice, la riga “var z = 4” è stata saltata dal compilatore perché dentro un commento multi linee.

var, let e commenti linguaggio swift

La prima regola

Non possono esistere variabili o costanti con lo stesso nome.

Ma allora una volta dichiarate non le posso più utilizzare? Certo che si. Una volta che creerai una variabile o costante, dopo la potrai utilizzare senza bisogno di esplicitare nuovamente che è una var/let. Il linguaggio Swift riesce a capirlo da se.

Guarda questo esempio:

La prima riga crea una variabile chiamata “laMiaVariabile” a cui viene assegnato, con il simbolo uguale, il valore numerico 5. Alla seconda riga, viene creata una costante, perché comincia con la keyword let, con valore 4.

Alla riga successiva, grazie all’utilizzo del nome della variabile cambiamo il valore alla “laMiaVariabile” da 5 a 10. Il simbolo uguale significa assegnazione. Questo vuol dire che ciò che c’era prima di quella riga viene sostituito con il nuovo valore dopo l’uguale. Infatti, se guardi la tua console, dovresti vedere come è cambiato il valore per via dei vari print lasciati dopo ogni assegnazione.

Se già a questo punto hai delle difficoltà a capire il codice, ti prego di lasciare un commento. Non vergognarti! Tutti abbiamo cominciato come lo hai fatto tu, quindi è normalissimo avere dei dubbi. Fai le tue domande e non pensare che siano stupide o meno, qui nessuno giudica nessuno. 

Inizializzazione

Definiamo alcune operazioni fondamentali.

Il processo di creazione e assegnazione di un valore, ad una variabile o costante, si chiama Inizializzazione. Definisce l’atto di creazione di una variabile e contemporaneo passaggio di un valore di partenza.

Nella pratica un’inizializzazione è la prima volta in cui mette piede, nel codice, quella variabile. Oltre a mettervi piede, deve essere accompagnato da un valore:

Forse non l’ho ancora detto ma quando parlo di variabili mi riferisco anche alle costanti, scusami se non lo esplicito ogni volta. In caso debba farti notare una differenza tra l’una e l’altra te lo dirò apertamente.

Passaggio di valori

Ti ricordi il concetto delle scatole? Bene!

Una scatola può passare ad un’altra scatola il suo contenuto. Cioè una variabile o costante del linguaggio Swift può passare il suo valore ad un’altra var o let.

Lavoriamo sempre per esempi. Copia ed incolla il seguente codice Swift nel tuo Playground:

Cos’è successo alla variabile zRicordandoti che il processo di esecuzione del codice parte sempre dall’alto, prima hai inizializzato 3 variabili con un valore numerico, poi hai stampato il valore con la print, poi qualcosa di strano…

Prima “z” prende il valore di “a” e poi alla riga successiva lo sostituisce con “b”. Se tra le due righe metti una print(z) capirai cosa voglio dire.

Esercizio 1. Passare valori da una costante ad una variabile.

Ricordati che una costante non può cambiare il suo valore una volta che è stata inizializzata.

Le operazioni matematiche

Molte delle operazioni possibili in Swift sono uguali a quelle matematiche. Te le riporto insieme ad esempi pratici:

Simbolo Spiegazione
+ Somma due numeri/variabili
Sottrae due numeri/variabili
* Moltiplica due numeri/variabili
/ Divide due numeri/variabili
+= Somma al suo stesso valore il nuovo
-= Sottrae al suo stesso valore il nuovo
*= Moltiplica al suo stesso valore il nuovo
/= Divide al suo stesso valore il nuovo

Prima di procedere oltre, prova a risolvere questi semplici esercizi. Se non dovessi riuscirsi, scrivi pure un commento in fondo alla pagina:

  • Esercizio 2. Crea due variabili “altezza” e “peso” e assegnagli un valore. Moltiplica i due valori e conserva l’informazione in una nuova variabile.
  • Esercizio 3. Utilizzando il simbolo += aumenta di un’unità il valore di una variabile. Cioè, dopo aver creato una variabile “numero” con un valore, alla riga successiva questo valore deve incrementare di 1. Se viene inizializzata con 4, alla riga successiva devi sommargli 1 in modo da ottenere il valore 5.

La priorità delle operazioni

Come in matematica, ogni operazione ha una priorità rispetto ad un’altra. La moltiplicazione viene eseguita prima dell’addizione e così via. Il linguaggio Swift esegue automaticamente le operazioni di ordine superiore e poi quelle minori.

Per gestire le priorità puoi utilizzare le parentesi tonde in modo da forzare un’operazione rispetto ad un’altra:

  • Esercizio 4. Senza eseguire il codice, qual’è il valore di questa operazione?

Mac_xCoding

Ho impiegato un po’ di tempo a scrivere questa lezione, aiutami semplicemente mettendo un mi piace o follow alle mie pagine.

[addtoany]

Grazie davvero :-)

I tipi di dato del linguaggio Swift

Inizializzare significa dare un valore ad una variabile alla sua dichiarazione:

Ok! “miaVar” ha valore 3, ma cosa rappresenta realmente? Ora che è stata inizializzata, con un numero, posso inserigli altre cose diverse?

Purtroppo no. Se una scatola contiene patate, per tutta l’esecuzione del programma quella variabile dovrà contenere patate, stesso discorso se gli mettessi un numero o delle parole. Questa particolare proprietà, cioè che una variabile non può cambiare tipologia di dato trasportata prende il nome di Type Safe.

Per esempio, nelle variabile o costanti del linguaggio Swift, oltre ai numeri, puoi inserire del testo. Il testo deve essere racchiuso tra le doppie virgolette (sotto verrà chiarito questo concetto).

Dopo aver creato una variabile inizializzata con una frase ed una con un numero, ho provato a passare il valore della var “numero” nella variabile “parola”. Un’operazione impossibile dato che non si possono eseguire operazioni tra tipi di valore differente.

Ma allora che tipo di dato o informazione può contenere una variabile?

Il tipo di dato puoi considerarlo come gli insiemi da cui pescare i dati. Ad esempio i numeri interi, cioè quelli senza la virgola, vengono descritti dalla parola chiave Int. Grazie a questa nuova conoscenza puoi affermare che la variabile “numero” contiene un valore che fa parte della famiglia degli Int.

I numeri con la virgola, per fare un altro esempio, vengono descritti dalla famiglia Double. Un numero come 4.0 è Double ma non è Int anche se il valore dopo la virgola, essendo zero, potrebbe farti pensare che sia un Int.

Le parole e le frasi appartengono alla famiglia delle String e così via. Esistono parecchi e svariati Tipi di Dato, cioè famiglie che ti permetteranno di descrivere meglio un’informazione memorizzata.

Ecco la lista dei Tipi di Dato maggiormente utilizzati nel linguaggio Swift:

Int Tutti i numeri interi positivi e negativi. Esempio : -1, -2, +3321, 0
Float Rappresenta l’insieme dei numeri reali, (gli Int + i numeri con la virgola). Esempio : -4.2, 2.004, 55, 31, 0.1
Double Simile al Float ma con una precisione dopo la virgola maggiore. Di default quando inserisci un numero con la virgola Swift lo interpreta come Double e non come Float. Esempio 4.00000001, 33, 5.231355602
Character Rappresenta i caratteri, si può assegnare solo un carattere ad una var, altrimenti diventa una stringa. Quando lo si assegna ad una var deve essere racchiuso tra gli apici ” “. Esempio : “a” “b” “1” “4” “z” ” ” . Anche lo spazio vuoto è un carattere!
String Più caratteri formano una stringa. Esempio : “Ciao sono una stringa” , “Matteo è nato nel 1993”.
Bool Rappresenta la condizione di VERO (true) o FALSO (false). Utilizzeremo questo tipo di dato più avanti.

Ecco un esempio dei tipi di dato del linguaggio Swift:

Dichiarazione Implicita

Quando inizializzi una variabile automaticamente, oltre a passare il valore, passi il tipo di dato. Alla scatola viene assegnata una categoria, da ora in poi potrà contenere solo elementi di quella categoria:

Una volta che hai inizializzato una variabile con un tipo di dato, non potrai più cambiarglielo. Infatti se alla variabile “a” provi a mettere un valore Double, il Playground, ti mostrerà un errore:

Stesso discorso vale anche per gli altri tipi di dato.

Esercizio 5. Esempio dichiarazione implicita tipo String.

Dichiarazione di tipo esplicita

Puoi assegnare il tipo di dato in modo esplicito. Ti basta inserire i due punti (:) dopo il nome della variabile. A seguire devi inserire il tipo di dato che vuoi assegnargli:

Senza aver inizializzato sei riuscito comunque ad etichettare la variabile, adesso il compilatore sa che da qui in avanti potrai inserirgli solo un determinato tipo di informazione.

La stessa procedura va fatta soprattutto quando un’inizializzazione non fornisce tutti i dati necessari da far capire il tipo che vuoi realmente utilizzare. Ad esempio se vuoi che una var sia di tipo Double e il primo valore che gli assegni è un 2, per non indurre in confusione il compilatore (che di default la tratterebbe come Int) devi obbligatoriamente esplicitarne il tipo:

Nell’esempio volevo creare una variabile di tipo Double, però il primo valore che volevo assegnargli era il “2”. Se non inserivo il tipo di dato, la variabile “varDouble”, sarebbe stata costretta a trattare solo gli interi quindi sarebbe stata di tipo Int.

Per ovviare il problema avrei dovuto scrivere il tipo di dato:

In questo modo il numero due, che verrebbe interpretato come Int se non ci fosse il tipo esplicitato, viene considerato come Double. Un Double, anche se viene utilizzato per rappresentare i numeri con la virgola, può rappresentare i numeri interi.

Dichiarazione di tipo esplicita linguaggio swift

Conversione esplicita

Come faccio a stampare con la print un valore di tipo Int?

In questi casi il linguaggio Swift offre uno strumento chiamato conversione di tipo esplicita momentanea. Guarda questo esempio in cui voglio provare a stampare, dopo un opportuno calcolo, l’area di un triangolo:

L’errore che generato si chiama: Errore di conversione Implicita. Il linguaggio Swift non è in grado di convertire un tipo di dato senza che tu gliel’abbia ordinato. Il motivo è abbastanza semplice, non sa quale dei due deve convertire!

Nell’esempio, la “stringaFinale” è una stringa a cui ho provato ad aggiungere il valore intero dell’area calcolata. Ovviamente eseguire stringa + intero genera incomprensione da parte del compilatore.

Il problema è sempre quello del: come sommo patate con cipolle?

Per risolvere questo problema puoi optare per 2 opzioni:

  • Per tutti i tipi di dato. Scrivi il nuovo tipo di dato seguito dalle parentesi tonde che incapsulano la variabile o il valore da convertire, ad esempio String(calcoloArea):
  • Solo per le stringhe. Inserire \ seguita dal nome della variabile racchiusa tra parentesi all’interno di una stringa:

Ecco che l’esempio di sopra si trasforma così:

Questa operazione la chiamo conversione di tipo esplicita momentanea perché effettivamente non viene cambiato il tipo della variabile, come erroneamente potresti pensare, bensì viene cambiato solo in quello specifico contesto o operazione.

Esercizio 6. Calcolare la media numerica di 4 numeri.

Ecco un’altro esempio e che puoi trovare utile per capire il meccanismo di passaggio da un tipo ad un altro.

Calcolare la media in float di 4 numeri di tipo diverso e stampare il risultato:

Perdita di informazioni passando da un tipo ad un altro

Dimenticavo! Fare una conversione, da un tipo di dato più grande (come il Double) ad uno più piccolo (come l’Int), comporta perdita di informazione.

Mi spiego meglio. Considera il seguente esempio:

Dov’è finito il .234? È stato perso perché un Double per diventare un Int doveva obbligatoriamente elidersi della sua parte decimale.

In definitiva, le conversioni senza perdita di dati:

  • da Int a Float o Double,
  • da Float a Double,
  • da Int, Float e Double in String.

Con perdita di dati:

  • da Double a Float o Int (in questo caso piena perdita delle parte con la virgola),
  • da Float a Int.

Ricordati che le stringhe fanno testo a parte e che tutti i tipi di dato possono essere convertiti a String senza perdita di dati.

P.S. La conversione di una String in un tipo numerico la studierai nelle prossime lezioni.

Esercizi svolti e commentati

Ecco una carrettata di esercizi svolti e commentati che ti invito a rifare per memorizzare meglio tutti i meccanismi.

Esercizio 7. Sommare due stringhe.

Crea due var/let ed inizializzale con un valore String, poi crea una terza var/let dove sommare le precedenti. Infine stampa il risultato:

Oltre ad aver inizializzato le due costanti, gli ho anche definito il tipo. Non è obbligatorio ma è comunque una buona norma da seguire.

Infine ho sommato le 2 let in una terza. Da notare che ho messo uno spazio tra la somma. Il motivo è che senza le avrebbe sommato generando una scritta tutta unita: “ciaomondo”.

Ho definito le due costanti come tali perché non le dovevo modificare, quindi non aveva senso definirle come variabili.

Esercizio 8. La divisione tra Int potrebbe generare un Double.

Quanto fa 1 diviso 2? 0.5

Ma se per noi esseri umani la questione è abbastanza semplice, non è per un linguaggio di programmazione.

Guarda cosa succede quando dividi due interi:

Dice che la divisione tra “a” e “b” fa 0. Di fatto farebbe 0.5, ma un Intero non può contenere un numero con la virgola e quindi prende solo la parte intera ovvero 0.

Questo è un errore gravissimo. Basta pensare che cose del genere potrebbero farti apparire dei soldi sul tuo conto corrente come farli scomparire. Tutto a causa di un errato utilizzo dei tipi di dato.

Per risolvere il problema, potresti forzare i due numeri a diventare dei Double grazie alla conversione esplicita:

Domanda: Prova a fare Double(a/b) e guarda cosa accade. Sapresti darti una spiegazione?

Se non sei riuscito a rispondere alla domanda, scrivi un commento alla lezione ;).

Conclusione e Primo test del corso

Questo è uno degli argomenti cardine della programmazione Swift, capito questo capirai senza problemi tutto il resto.

Se c’è qualcosa che non hai capito o non riesci a risolvere un esercizio, per favore lascia un commento. Oltre ad aiutare me a migliorare i contenuti, aiuterai anche gli altri.

Da questa lezione inoltre cominciano i Quiz, per visualizzarli e quindi metterti alla prova devi essere registrato al sito e cliccare sul bottone che c’è qui sotto.

Se non vuoi registrarti e quindi avere la possibilità di testare le tue conoscienze, ti lascio comunque alcune domande in modo da metterti alla prova da solo.

Esercizi Swift non risolti

  • “var a= 4*2 + (25+2 * (4/2) )” quale operazione viene eseguita per prima?
  • Se converto un Double in Int ho perdita di dati?
  • Se “var x: Float = 4.32″ è una variabile di tipo Float, cosa devo eseguire per trasformare il valore in Int?
  • Il simbolo = (Uguale) in informatica quale significato ha?
  • “var x = 4.2” di default che tipo di dato acquisirà?
  • Le restanti domande sono solo per utenti registrati.

P.S. Ti ricordo che registrandoti al corso di programmazione Swift avrai la possibilità di ottenere un certificato/attestato non appena avrai concluso tutte le lezioni.

Buona Programmazione!

Changelog

  • 1/10/2016 – Aggiunto l’indice della lezione.
  • 29/09/2016 – Aggiunto il changelog. Modifiche al testo e check compatibilità con Xcode 8.

Torna a: Corso gratuito linguaggio di programmazione Swift > Le basi del linguaggio Swift

Start typing and press Enter to search

Array e Dizionari in Swift