1. Le basi della programmazione in Swift Flashcards

1
Q

Le prime keyword di Swift: var e let

A

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.

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Variabile con il linguaggio Swift

A

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:

1

var nomeVariabile

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:

var laMiaVariabile = 5

print(laMiaVariabile)

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.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Costante con il linguaggio Swift

A

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:

let costanteNumerica = 4

print(costanteNumerica)

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Commentare il codice

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

La prima regola

A

Non possono esistere variabili o costanti con lo stesso nome.

var peppe = 21

var peppe = 25 // ERROREEEEEEE

let peppe = 25 // ERROREEEE

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Inizializzazione

A

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:

var ciccio = 2 // Questa è una INIZIALIZZAZIONE

let peppe = 4 // Questa è pure una INIZIALIZZAZIONE

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Passaggio di valori

A

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:

//prima inizializzo 3 variabili

var a = 2

var b = 5

var z = 0

//stampo il valore di tutte e 3 le variabili

print(a)

print(b)

print(z)

//poi passo il contenuto della scatola a alla scatola z

//e subito dopo della scatola b alla z

z = a

z = b

//stampo il valore di tutte e 3 le variabili

print(a)

print(b)

print(z)

Cos’è successo alla variabile z? Ricordandoti 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.

let a = 4

var b = 0

b = a

var c = 0

c = b

print(a)

print(b)

print(c)

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Le operazioni matematiche

A

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

SimboloSpiegazione

+Somma due numeri/variabili

var a = 2

var b = a - 2

//b è = 0

*Moltiplica due numeri/variabili

var a = 2 * 2

var b = a * 1

var c = a * b

/Divide due numeri/variabili

var a = 4/2

var b = a/2

+=Somma al suo stesso valore il nuovo

var a = 2

a += 4

// il risultato è 6, che equivale ad: a = a + 4

-=Sottrae al suo stesso valore il nuovo

var a = 2

a -= 4

// il risultato è -2, che equivale ad: a = a - 4

*=Moltiplica al suo stesso valore il nuovo

var a = 2

a *= 4

// il risultato è 8, che equivale ad: a = a * 4

/=Divide al suo stesso valore il nuovo

var a = 4

a /= 2

// il risultato è 2, che equivale ad: a = a / 2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

La priorità delle operazioni

A

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:

var a = 2*((4+2)/3)

//prima esegue la somma tra 4 e 2 poi divide per 3 ed infine esegue la moltiplicazione per 2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

I tipi di dato del linguaggio Swift

A

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

var miaVar = 2 // questa è una inizializzazione

miaVar = 3 // questo è un utilizzo della var inizializzata sopra

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).

var parola = “ciao”

var numero = 2

parola = numero // ERRORE: La var “parola” non può contenere numeri

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.

var altroNumero = 4 // Questo appartiene alla 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.

var numeroDouble = 4.5 // Questo valore appartiene alla famiglia dei Double

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:

var numeroIntero = -454 // questo è un Int

numeroIntero = 499 // questo è ancora un Int

var peso_corporeo = 65.90 // questo è un Double

peso_corporeo = 70 // sono ingrassato ma questo è ancora un Double perché era stato inizializzato con un valore double

let nome = “Giuseppe” // String

let cognome = “Sapienza” // String

var xCodingFantastica = true // questo è un Bool

var sonoBello = false // questo è un Bool

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Dichiarazione Implicita

A

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:

var a = 2 // INIZIALIZZAZIONE DI TIPO INT

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:

a = 44.2 // ERRORE! POSSO CONTENERE SOLO INTERI

Stesso discorso vale anche per gli altri tipi di dato.

Esercizio 5. Esempio dichiarazione implicita tipo String.

var ciao = “ciao”

ciao = “ciao Mondo”

ciao = 2 // ERRORE! La variabile “ciao” è di tipo String e non puoi mettere un Int

// al massimo avresti potuto fare

ciao = “2”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Dichiarazione di tipo esplicita

A

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:

var variabileEsplicita: tipo

var variabileEsplicita: Float

let variabileEsplicita_1: Double // il Double è simile al Float ma con una precisione, dopo la virgola, maggiore

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:

var varDouble = 2

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:

var varVeroDouble: Double = 2

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Conversione esplicita

A

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:

let base = 4

let altezza = 2

let calcoloArea = (base * altezza)/2 //AREA DEL TRIANGOLO

let stringa = “l’area del triangolo è uguale a “

var stringaFinale = stringa + calcoloArea // ERROREEE CONVERSIONE! string + int

// unire la stringa con

// un valore intero genera errore.

// BISOGNA ESEGUIRE LA CONVERSIONE DI calcoloArea

print(stringaFinale)

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):

var stringaFinale = stringa + String(calcoloArea)

Solo per le stringhe. Inserire \ seguita dal nome della variabile racchiusa tra parentesi all’interno di una stringa:

var stringaFinale = stringa + “(calcoloArea)”

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

let base = 4

let altezza = 2

let calcoloArea = (base * altezza)/2

let stringa = “l’area del rettangolo è uguale a “

//oppure con questa let stringaFinale = stringa + String(calcoloArea)

var stringaFinale = stringa + “(calcoloArea)”

print(stringaFinale)

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:

let x1: Float = 4

let x2 = 3.5 // lo considera come un DOUBLE e non come un FLOAT

let x3 = 5 // non ho specificato il tipo gli lascio intendere che sia un intero

let x4: Double = 2 // In questo caso il 2 viene considerato come Double, quindi come 2.0

var media: Float = (x1 + Float(x2) + Float(x3) + Float(x4))/4

print(“la media è : (media)”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Perdita di informazioni passando da un tipo ad un altro

A

are 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:

var x: Double = 55.234

var y: Int = Int(x) //converto x in Int

print(“x trasformato in Int = (y)”)

//x trasformato in Int è uguale 55

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.

let numeroA: Int = 45

let numeroB: Double = 7.7

var stringaA: String = “(numeroA)”

var stringaB: String = “(numeroB)”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Array linguaggio Swift

A

Puoi considerare un Array come un lungo treno dove ogni vagone contiene l’informazione da conservare. Ogni treno è una collezione potenzialmente infinita di vagoni che trasportano un’informazione. Ogni vagone, inoltre, è accessibile tramite un indice (un numero di identificazione).

Fai finta che all’interno di una scatola (una variabile) stai buttando, invece di una singola informazione, tante altre scatole tutte delle stesso tipo. I passaggi da fare per l’inizializzazione di un Array sono i seguenti:

Definire una variabile o costante.

Assegnargli un Array di valori. I valori sono racchiusi da parentesi quadre e divisi, l’uno dall’altro, da una virgola:

var array = [10, 44, 33, -1]

Adesso la variabile “vettore” rappresenta l’Array per tutta la sua interezza. Infatti se nel codice scrivi print(array), la funzione stamperà tutti i valori contenuti all’interno della variabile:

var array = [10, 44, 33, -1]

print(“La lista contenuta dall’array è “)

print(array)

// La lista contenuta dall’array è

// [10, 44, 33, -1]

Qual’è il tipo di dato del vettore? Nella lezione precedente ti ho detto che esistono delle famiglie che descrivono i valori che puoi assegnare ad una var o let. Per esempio gli Int sono la famiglia dei numeri interi e String descrive le parole.

Nel caso dell’array che hai inizializzato nell’esercizio, i valori contenuti all’interno sono degli Int. Dato che un array è descritto dalle parentesi quadre [], il tipo di un array si forma inserendo il tipo di dato all’interno delle parentesi. Esempio, se volessi creare un array di String e volessi anche assegnare il tipo in maniera esplicita, scriverei:

var array_string: [String] = [“questo”, “è”, “un array di stringhe”]

Esercizio 0. Crea ed inizializza un array di numeri Double. Definisce in maniera esplicita il suo tipo di dato.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Accedere agli elementi dell’array

A

Considera il seguente Array di Interi:

var punteggi: [Int] = [20, 55, 32, 100, 0]

Punteggi ormai sai che rappresenta l’intera lista degli elementi contenuti in esso, ma come accedo ad un singolo elemento della lista?

All’inizio della lezione ti ho detto che l’Array in Swift non è altro che una sorta di treno dove ogni vagone contiene l’informazione. Ogni vagone inoltre è identificato da un indice.

Nel primo vagone c’è il numero 20, nel secondo il numero 55 e così via.

L’indice parte sempre da zero fino ad arrivare ad un numero grande quanto il numero di elementi contenuti meno uno.

Perché N-1? Immagina un Array di 10 elementi.

Se il conteggio degli elementi parte da 0, per arrivare a 10 deve fermarsi al numero 9. infatti 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 sono 10 numeri e non 9 come erroneamente potresti pensare.

Con il linguaggio Swift, per poter accedere ad ogni singolo vagone dell’Array, devi utilizza questa notazione:

var punteggi = [20, 55, 32, 100, 0]

punteggi[0]

punteggi[1]

punteggi[2]

// ….

punteggi[9]

Quindi per accedere all’informazione contenuta alla posizione iesima, si esplicita vicino al nome dell’Array, la posizione dell’elemento cercato. Utilizzando la sintassi nomearray [numeroPosizione]:

var altro_array = [10, 233, 55]

var posizione = 0

altro_array[posizione]

Di fatto dichiarando la posizione non fai altro che accedere all’informazione della scatola alla posizione X contenuta nell’Array.

Un vettore può contenere diversi tipi d’informazione, cioè valori che appartengono a diversi tipi di dato:

var array_misto = [1, 2, “ciao”, 55.32]

In questa prima parte del corso gratuito non utilizzeremo questa sintassi. Cioè ti farò scrivere array che hanno tutti lo stesso tipo di dato. Il motivo di tale scelta verrà spiegata nell’ultimo modulo del corso quando arriverai alla programmazione ad oggetti.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Tipi di dato vuoti o di partenza

A

Se non vuoi inizializzare subito un Array, cioè non vuoi dargli un valore iniziale, il linguaggio Swift ti da la possibilità di inizializzarlo come vuoto. Per inizializzare un Array come vuoto devi:

Dichiarare una variabile.

Assegnargli il tipo di dato che dovrà contenere, tra parentesi quadre, e aggiungere due parentesi tonde.

Quindi se vuoi inizializzare un Array di interi e lasciarlo vuoto devi fare:

var arrayVuoto = Int

var arrayVuotoString = String

Il motivo delle parentesi tonde lo scoprirai quando arriverai a studiare la programmazione ad oggetti. Per il momento, quello che ti interessa sapere è che puoi assegnare il tipo di dato per rendere vuoto un vettore. Lo stesso discorso vale anche per le normali variabili infatti:

var a = Int()

var b = Double()

Prova a stampare il contenuto dell’Array, scoprirai che verranno stampate solo le parentesi quadre le quali non hanno niente al loro interno:

print(arrayVuoto)

// []

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Problema nella dichiarazione

A

Attenzione! C’è una piccola differenza tra inizializzato e dichiarato infatti prova ad eseguire il seguente codice:

var vettore: [Int] // questa è solo una dichiarazione

print(vettore)

Cosa facilmente risolvibile così:

var vettore: [Int] // questa è solo una dichiarazione

vettore = [1, 2, 6, 111]

print(vettore)

Questo pseudo errore verrà corretto nelle prossime lezioni, tanto per il momento hai già tutti gli strumenti per creare un Array.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Assegnare una lista

A

Ora ti assegno un nuovo esercizio e nel frattempo ne approfitto per ribadire alcuni concetti.

Esercizio 1. Dichiara una variabile di tipo vettore di String, poi assegna una lista di 2 elementi al vettore e stampa i suoi elementi.

Questa volta l’esercizio richiede una Dichiarazione.

Successivamente devo assegnargli una lista (quindi un vettore) di String di due elementi a scelta.

E infine stampare i due unici due elementi.

var vettore: [String] // DICHIARIO UN VETTORE DI STRINGHE

vettore = [“Ciao”, “ Mondo”] // ASSEGNO UN VETTORE DI STRINGHE

print(vettore[0]) // STAMPO RICORDANDOMI CHE L’INDICE DEGLI ELEMENTI PARTE DA 0

print(vettore[1])

20
Q

Sommare due array

A

Un Array può essere sommato ad un altro, con l’unica differenza che l’operazione di somma unisce le due liste di elementi.

Metodo 1. Utilizzare un terzo Array, detto di supporto:

var arrayA: [String] // dichiaro un array di String

var arrayB: [String] // dichiaro un array di String

arrayA = [“Ciao “, “Mondo”] // assegno, cioè inizializzo, all’arrayA con array con due stringhe

arrayB = [” io mi chiamo”, “ Giuseppe”] // assegno all’arrayB un array con due stringhe

var arrayC = String // inizializzo un nuovo arrayC con un array di stringhe vuote

arrayC = arrayA + arrayB // sommo i due vettori e conservo il risultato nell’arrayC

print(arrayC)

Metodo 2. Ampliare un vettore esistente con l’aggiunta degli altri:

var array1: [Int]

var array2: [Int]

var array3: [Int]

array1 = [1, 2, 3]

array2 = [4, 5, 6]

array3 = [7, 8, 9]

array1 += array2 + array3 // equivale ad aver scritto array1 = array1 + array2 + array3

print(array1)

Ti ricordo che, per le variabili, l’operatore += non fa altro che sommare un valore al suo stesso valore, ad esempio:

var a = 4

var b = 4

b += a // è la stessa cosa di dire b = b + a

Attenzione perché lo stesso principio non vale per la sottrazione, ma non preoccuparti troverai una soluzione nelle lezioni successive.

21
Q

Modificare un elemento dell’Array

A

Ti ricordi quando ti dicevo che un Array non è altro che una scatola con più scatole uguali all’interno?

Quando accedi alla posizione x di un Array di fatto stai considerando la scatola interna contenuta dall’Array in quella posizione. Peppe, ma scatola non lo usi come sinonimo di variabile? Esatto.

Questo ti permette, oltre alla visualizzazione dell’elemento al suo interno, di aggiungere e modificarne il contenuto.

var emptyArray = Int

emptyArray = [1, 2, 4] // riempio l’Array con la lista di valori 1, 2, 4

emptyArray [2] // vedo il valore dell’Array alla posizione 3 - il conteggio parte da 0 e non da 1

emptyArray [2] = 3 // modifico il valore dell’Array alla posizione 3

emptyArray // visualizzo l’Array modificato

Nell’esempio ho sbagliato volontariamente a riempire il vettore. Avrei voluto inserire i numeri 1, 2 e 3 ma ho erroneamente messo un 4 al posto del 3. Per sostituirlo non ho fatto altro che:

Accedere al valore della scatola alla posizione 2 (dato che il conteggio parte da 0, significa che sto leggendo il terzo elemento).

Assegnargli un nuovo valore (Stessa identica procedura utilizzata per le variabili).

Nell’esempio non utilizzo la print per visualizzare i valori. Questa particolare sintassi vale solo ed esclusivamente all’interno del Playground e ti permette di evitare di scrivere ogni volta print.

22
Q

La funzione append. Aggiungere un nuovo elemento all’Array in modo semplice e veloce.

A

Spesso capita di dover aggiungere degli elementi in seguito alla creazione dell’Array. Pensa ad una lista della spesa dove solo in seguito ti accorgi che manca qualcosa. Si, tutti dimentichiamo di comprare qualcosa al supermercato!

Don’t worry, be happy.

Fortunatamente il linguaggio Swift, oltre alla print, ti mette a disposizione svariate funzioni che ti aiutano nella scrittura del codice. Tra queste, una che mi sento in dovere di farti conoscere subito è la funzione append. Te lo ripeto, anche se per il momento non sai da dove saltano fuori e non sai cosa siano le funzioni, non preoccuparti! Prendi per buono quello che ti sto dicendo.

Cosa fa questa misteriosa funzione append? La funzione append permette di aggiungere un nuovo elemento in coda all’Array.

Per accedere alla funzione append di un Array in Swift, ti basta inserire un punto dopo il nome del vettore e selezionare la funzione append (ma tu guarda, esistono tantissime altre funzioni):

mioArray.<lista_funzioni></lista_funzioni>

A questo punto, utilizza la funzione append per aggiungere ad un Array un nuovo elemento:

var punteggi [1,2,3,4]

punteggi.append [5]

punteggi //aggiunge 5 al fondo [1,2,3,4,5]

23
Q

La funzione count. Scoprire velocemente da quanti elementi è formato un array

A

In quest’altro esempio ti mostro la funzione count che ti restituisce il numero di elementi contenuti nell’Array :

var listaSpesa: [String]

listaSpesa = [“Pasta”, “Cotolette”, “Nutella”]

print(listaSpesa)

//quante cose sto comprando?

print(“Stai comprando: (listaSpesa.count) cose”) //La funzione COUNT ritorna il numero di elementi dell’array

//stai comprando: 3 cose

//CA… HO DIMENTICATO IL GELATO!!!

listaSpesa.append(“Gelato”)

print(“Adesso stai comprando: (listaSpesa.count) cose”)

//adesso stai comprando: 4 cose

//LA PASTA NON MI SERVE PIU’, ORA LA SOSTITUISCO CON UN POLLO

listaSpesa[0] = “Pollo”

print(listaSpesa) // adesso la pasta è scomparsa perché sostituita dal pollo

24
Q

Dizionari linguaggio Swift

A

Un Dizionario è una collezione binaria di elementi, dove al primo membro troviamo la chiave unica e al secondo membro il valore. Come i nostri dizionari associano ad una parola un significato, i dizionari informatici fanno lo stesso.

Ammettiamo che devi cercare la parola “informatica” in un vocabolario, cosa fai?

Sfogli a caso il vocabolario finché non trovi la parola informatica?

Vai all’indice “I” e poi cerchi la parola informatica?

Mi sembra più sensata la seconda opzione. Ma cosa centra con il Dizionario in Swift?

Beh centra! Un Dizionario in Swift ha le stesse peculiarità, ti permette di definire una lista dove ogni elemento della lista è composto da una coppia, la chiave e il valore.

La chiave ha lo scopo di catalogare e descrivere il tipo di informazione. Puoi considerarla come l’estensione dell’indice che rappresenta la posizione in un Array. In un Array, per così dire, la chiave è in qualche modo rappresentata dall’indice che, a differenza, è solo numerico.

Il valore associato alla chiave è il vero portatore dell’informazione del Dizionario.

Con il linguaggio Swift, la procedura per rappresentare un Dizionario, è simile a quella dell’Array. L’unica differenza sta nell’esplicitare la chiave:

var/let nomeDizionario = [

chiave: valore,

chiave: valore

]

Le parentesi quadre ti fanno subito notare come la struttura sia simile a quella di un Array Swift, la differenza sta nel fatto che, come elemento va inserita una coppia “chiave”: “valore”, separata dalle restanti da una virgola.

La chiave va sempre rappresentata a sinistra, il valore a destra.

Ritornando all’esempio del Dizionario reale, ecco come potresti rappresentare un Dizionario in Swift:

var dizionario = [

“informatica”: “scienza che studia l’uso della tecnologia”,

“albergo”: “una struttura delegata alla ricezione di ospiti”,

“giuseppe”: “nome proprio di persona”

]

25
Q

Accedere ai contenuti del Dizionario

A

Il processo è tale e quale a quanto visto con i vettori. L’unica cosa è che devi sostituire l’indice numerico con la chiave desiderata:

var a = dizionario[“informatica”] // RICORDATI CHE DANDO UNA CHIAVE AL Dizionario LUI ACCEDERà AL VALORE CONTENUTO IN QUELLA CHIAVE

//QUINDI PUOI ASSEGNARLO AD UN’ALTRA VARIABILE PER STAMPARLO

print(a)

//avrei potuto comunque fare

print(dizionario[“albergo”])

P.S. se nel Playground ti spunta qualcosa come -> Optional(…), non preoccuparti è normale

26
Q

Aggiunta e modifica di un elemento

A

Ovviamente i dizionari informatici non hanno il solo compito di descrivere le parole ma possono essere estesi nell’utilizzo.

Ad esempio, crea un Dizionario per la gestione dello staff di un’azienda:

var occupazioni = [

“Giuseppe”: “Ingegnere”,

“Matteo”: “Sviluppatore”,

“Francesco”: “Traduttore”

]

Se a tale Dizionario volessi aggiungere un nuovo lavoratore non dovrei far altro che esplicitare una nuova chiave e assegnargli un valore. La stessa identica cosa va fatta quando vuoi modificare il valore di una chiave:

occupazioni[“Orazio”] = “Manager” // aggiungo un nuovo elemento

occupazioni // visualizzo il Dizionario

occupazioni[“Matteo”] = “CEO” // modifica per chiave

occupazioni // controllo se l’elemento con chiave “Matteo” è stato modificato

27
Q

Dizionario vuoto

A

Stessa pasta e cucuzza! In più al tipo del valore devi definire il tipo della chiave, ovviamente chiave e valore possono avere tipi differenti:

var dizionarioStringheFloat = String: Float

var dizionarioFloatFloat = Float: Float

28
Q

La funzione updateValue. Aggiungere e modificare un valore del Dizionario

A

Anche per i Dizionario esiste una funzione apposita per l’aggiunta di un elemento. In questo caso però la funzione in questione si chiama updateValue e si comporta in questa maniera:

Se esiste la chiave in questione allora modifica il valore.

Se la chiave non esiste crea la chiave e gli da quel valore.

Per utilizzare la funzione updateValue devi sempre esplicitare la chiave e il valore da aggiungere o modificare, quindi considera il seguente esempio:

var stipendiDipendenti: [String: Double]

stipendiDipendenti = [

“Giuseppe”: 0,

“Matteo”: 2500.00,

“Antonio”: 900.00

]

//DANNAZIONE GIUSEPPE GUADAGNA 0, AUMENTIAMO IL SUO STIPENDIO

stipendiDipendenti.updateValue(4500.00, forKey: “Giuseppe”) // SOLAMENTE LA FUNZIONE VUOLE PRIMA IL VALORE E POI LA CHIAVE

var guadagno = stipendiDipendenti[“Giuseppe”]

print(“Adesso Giuseppe guadagna: (guadagno)”)

print(“nella tua azienda ci sono (stipendiDipendenti.count)”)

//HO ASSUNTO UN NUOVO DIPENDENTE, LO AGGIUNGO AL DIZIONARIO

stipendiDipendenti.updateValue(1600.50, forKey: “Maurizio”)

print(“nella tua azienda adesso ci sono (stipendiDipendenti.count)”)

29
Q

Stampare un Dizionario. La stampa casuale dei valori

A

Se hai già provato a stampare un Dizionario, quindi hai provato a fare qualcosa del genere:

var linguaggiDiProgrammazione: [Int: String] = [

1: “Swift”,

2: “Objective-C”,

3: “C”,

4: “C++”,

5: “Python”

]

print(linguaggiDiProgrammazione)

Avrai sicuramente notato la stampa in ordine casuale e non ordinata per chiave.

La stampa di un Dizionario in modo casuale è di default imposta dal linguaggio Swift e non può essere modificata se non con strumenti avanzati che verranno trattati a fine corso, quindi, non preoccuparti, è assolutamente normale che vengano stampati così.

30
Q

If else in Swift. L’arte del controllo del codice

A

If ed else, letteralmente “se” e “altrimenti“, è un’istruzione che permette di eseguire, o meno, una porzione di codice in base allo stato di una condizione.

Spesso ti sarà capitato di dover scegliere tra due o più alternative:

Oggi sono stanco, studio o non studio?

Se studio cosa mi metto a studiare?

E se non studio cosa faccio?

Questa metodo di interazione con la realtà è continuamente presente durante la quotidianità. Spesso non ci fai nemmeno caso ma reagisci a qualsiasi evento utilizzando sempre la logica del: faccio o non faccio?

Non te ne accorgi perché il cervello è talmente allenato a lavorare in questa maniera che non ti da nemmeno il tempo di pensarlo. Una cosa del genere avviene durante le fasi di pericolo.

Sicuramente ti sarà capitato di vederti arrivare addosso un pallone e di schivarlo automaticamente. L’automazione è data dal cervello che dentro di se ha attivato, prima di fartelo notare, una strategia di tipo if else.

Schivo il pallone e evito di farmi male o prendo il pallone in faccia? La nostra indole consiglia sempre al nostro “io” di salvarsi e quindi la scelta non può che ricadere nell’opzione più sicura, schivare il pallone.

Nella vita sei sempre di fronte ad un bivio dove imboccare una strada significa inesorabilmente non poter intraprendere l’altra.

Ok! La smetto con la filosofia.

Se agli esseri umani è permesso poter scegliere, perché non dovrebbe essere permesso ad un Computer, ad un iPhone e di conseguenza al nostro codice?

Nella lezione introduttiva ti ho detto che i linguaggi di programmazione cercano di emulare il nostro modus operandi. In base a questa supposizione, anche il linguaggio Swift dovrebbe permettere di strutturare il codice utilizzando la logica dell’if-else (sistema presente in tutti i linguaggi di programmazione).

31
Q

Pseudo codice: Risolvere un problema informatico senza scrivere una riga di codice

A

Un’altra caratteristica di un buon programmatore è quella di saper immaginare il funzionamento del codice prima della sua scrittura.

L’immaginazione è il sistema che ci permette d’arrivare ad una soluzione concreta per un qualsiasi problema. Immaginare il funzionamento di un codice ti permetterà d’avere un quadro semi completo di ciò che andrai a realizzare.

Ad esempio, in base alle conoscenze che hai acquisito dalla lezione precedente, se adesso ti dicessi: “Conserva in un dizionario i primi versi della divina commedia”, tu cosa faresti?

Inizieresti a pensare. Pensando assoceresti la parola “conserva” ad una variabile/costante e la parola “dizionario” al dizionario del linguaggio Swift. Cioè, mentre leggi un problema, nella tua testa dovresti avere una mezza idea di come sarà architettato il codice della tua applicazione.

Alla fine, quando ti siederai davanti al Playground, scriverai:

var divinaCommedia = [

1: “Nel mezzo del cammin di nostra vita”,

2: “mi ritrovai per una selva oscura”,

3: “ché la diritta via era smarrita”

]

L’esercizio era relativamente semplice e non richiedeva, almeno per me, molta immaginazione per essere risolto.

Se lo è stato per te, fammelo notare in un commento. Qui non mangiamo i nuovi programmatori.

Quando gli esercizi iniziano a diventare di una certa portata o quando ti metterai a sviluppare applicazioni con il linguaggio Swift, pensare risulterà poco vantaggioso perché rischieresti di perdere pezzi del tuo ragionamento.

A tal proposito, se vuoi, puoi cominciare a leggere questa lezione su come impostare un’idea ed un progetto di un’applicazione del corso successivo.

Ecco che in tuo soccorso arriva lo pseudo codice!

32
Q

Scrivere in pseudo codice

A

Lo pseudo codice è un modo di rappresentare il codice in maniera user-friendly.

Consiste nello scrivere su una tavoletta d’argilla, va benissimo anche la carta o il notepad, il comportamento del codice del programma.

Ti faccio direttamente un esempio così da capirci.

Crea il codice per la gestione della vita di un personaggio di un video gioco. Il codice deve controllare i livelli di salute del PG e in particolare deve fare due cose:

Quando la vita scende sotto lo 0 (zero) deve eseguire delle azioni (per esempio mostrare sullo schermo il messaggio: Sei morto).

Altrimenti ne eseguirà altre (tipo permetterti di continuare a camminare e cose del genere).

Ecco come io ho pensato di risolverlo:

L’esercizio parla di gestione della vita. Mmmm in genere la vita in un videogioco è rappresentata da un numero.

Come posso gestirla? Ecco! Una variabile di tipo Double chiamata vitaGiocatore!

Poi serve un controllo, controllo, controllo …. Trovato! Serve qualcosa che a che fare con la logica del: “Se succede qualcosa allora fai questo, altrimenti fai altro”.

Sicuramente dovrò adottare un if else in Swift.

Ogni volta che pensi ad un probabile codice, puoi abbozzarlo sul foglio in maniera discorsiva. in questo modo genererai un documento simile al seguente:

variabile vitaGiocatore = 0

Se la variabile vitaGiocatore è <= 0 {

dentro queste parentesi eseguo azioni da morto

} altrimenti {

dentro queste parentesi eseguo azioni da vivo

}

Capito il meccanismo?

Prima di buttarsi nella scrittura del codice è necessario avere un’idea di ciò che andrai a creare. Per il momento questa prassi ti potrà sembrare solo qualcosa di superfluo ma, quando incomincerai a programmare un’applicazione, non potrai farne a meno.

33
Q

La sintassi dell’if else in Swift

A

Adesso non serve altro che sostituire lo pseudo codice con il codice vero e proprio.

La sintassi standard dell’if else in Swift è la seguente:

if (<condizione>) {</condizione>

<if_istruzioni></if_istruzioni>

} else {

<else_istruzioni></else_istruzioni>

}

L’esempio della vita di un PG, da pseudo codice in codice Swift, si trasforma nella seguente maniera:

var vitaGiocatore = 10 // prova a cambiare il valore per vedere i cambiamenti

if (vitaGiocatore >= 50) {

print(“sono più che vivo”)

} else {

print(“sono morto!”)

}

Noi esseri umani riusciamo a capire quasi immediatamente quando una condizione è vera oppure no.

Ma qual è il meccanismo che sta dietro ad un linguaggio di programmazione come Swift?

Quando ho scritto: if (vitaGiocatore >= 50), come fa a capire se “vitaGiocatore” è maggiore o uguale di 50?

La variabile vitaGiocatore rappresenta un valore Intero (Swift lo capisce in automatico perché hai assegnato un valore Intero, cioè senza virgola). Non ti ricordi cosa sono i tipi di dato? Rinfrescati la memoria leggendo la lezione sulle variabili e costanti del linguaggio Swift.

Quando l’esecuzione del codice arriva alla riga successiva, trova la parola if. Il compilatore esegue queste operazioni:

Entra dentro la condizione

Estrapola il contenuto della variabile (cioè prende il valore dalla variabile vitaGiocatore)

Lo confronta con il valore che sta dopo l’operatore logico

Nella pratica prende il contenuto di vitaGiocatore e, dato che c’è l’operatore >=, si domanda:

la variabile vitaGiocatore, che vale 10, è maggiore o uguale di 50?

Un po’ come se facesse una cosa del genere:

vitaGiocatore = 10

if (10 >= 50) // <- QUESTO è QUELLO CHE VEDE IL COMPILATORE QUANDO ESEGUE LA RIGA DELL’ESEMPIO

All’interno della condizione viene eseguito un confronto. La cosa che non devi mai dimenticare è che è sempre un confronto tra l’elemento di sinistra con l’elemento di destra.

34
Q

Lo stato di una condizione: true o false? ed il tipo Bool

A

Quando avviene l’operazione di confronto, il compilatore è in grado di capire 2 cose:

La condizione è TRUE (vera) quando l’elemento di sinistra soddisfa il confronto con l’elemento di destra.

La condizione è FALSE (falsa) quando l’elemento di sinistra non soddisfa la condizione di confronto.

Nel caso della vita del giocatore, il compilatore, dedurrà che quella condizione è false perché 10 è minore di 50.

Fai attenzione a non confonderti!

Secondo te, l’operazione 4 < 5 quale delle due condizioni ritornerà?

Te l’ho fatto notare perché in certi casi sei indotto a pensare al contrario. Ovvero pensi che 5 è maggiore di 4 il quale ovviamente renderebbe FALSE il 4 < 5 nell’ottica della programmazione. Nel nostro esempio, quindi, il confronto ritornerà un TRUEperché: 4 è vero (true) che è minore di 5.

Apri il playground e scrivi il seguente codice:

var condizione: Bool

var x = 4

var y = 5

condizione = (x > y)

print(“(x) è maggiore di (y)? (condizione)”)

La condizione è un tipo di dato chiamato Booleano: un tipo di dato che può essere solamente TRUE o FALSE (l’ho elencato nei tipi di dato della lezione sulle variabili e costanti).

Perché si chiama Booleano? Perché deriva dal nome del matematica che per primo ha definito questa particolarità: George Bool.

35
Q

Il blocco di istruzioni

A

Un blocco di istruzioni è il codice delimitato da due parentesi graffe.

Subito dopo la condizione dell’if è stata scritta una parentesi graffa.

Questa sta ad indicare che, da ora in avanti, fin quando non troverà la parenti di chiusura, tutto il codice all’interno verrà attivato solo quando verrà verificata la condizione.

var x = 4

var y = 5

if (x > y) {

// se la condizione è TRUE entro dentro questo blocco

print(“TRUE: (x) è maggiore di (y)”)

} else { // ELSE significa in programmazione: SE NON E’ TRUE ALLORA

// se la condizione è FALSE entro qua

print(“FALSE: (x) è minore di (y)”)

}

Il blocco di istruzioni dell’if, viene attivato solo se la condizione è true mentre, quello dell’else solo se la condizione dell’if è false.

36
Q

Gli operatori Logici

A

Eccoti invece quali sono gli operatori logici che non fanno altro che permetterti di estendere la condizione di un if.

Operatore Descrizione operatore

!Il ! o Not inverte una condizione Booleana, se è true la considera false e viceversa. Va inserito come prefisso di una variabile, costante o operazione di confronto:

var sonoBello = false

if !sonoBello {

print(“sono brutto”)

} else {

print(“sono bello”)

}

La condizione !sonoBello può essere letta come: “se non sono bello allora”.&&Il simbolo && (And) permette di concatenare più istruzioni di verifica le quali devono essere entrambe e contemporaneamente true.

if (variabile > x && variabile < y) {

print(“variabile è sia maggiore di X che minore di Y”)

}

||Il simbolo || o Or permette di concatenare più istruzioni di verifica. L’intera condizione è true se almeno una delle istruzioni di controllo è true.

if (variabile == x || variabile > y) {

print(“variabile è uguale a X OPPURE è maggiore di Y”)

}

37
Q

If a cascata o concatenati

A

La bellezza di questo tipo di istruzioni è che possono essere combinate tra loro. La concatenazione avviene aggiungendo la parola “if” a seguire della parola “else” e definendo una nuova condizione di controllo:

var x = 10

var y = 12

if (x == y) {

print(“x e y sono uguali”)

} else if (x > y) {

print(“x è maggiore di y”)

} else {

print(“x è minore di y”)

}

L’espressione viene detta if-else-if.

Nell’esempio che vedi sopra:

Il primo if controlla che x sia uguale o meno a y.

La seconda istruzione è l’else if e controlla il caso in cui la x sia maggiore di y.

L’ultimo è l’else classico e si attiva quando i due if sovrastanti non vengono soddisfatti.

L’ordine degli if è fondamentale! Pena l’espulsione da Hogwarts.

Se ci pensi è logo. Perché se il compilatore entrasse in un’istruzione allora non non potrebbe mai entrare nelle altre.

Ritorniamo al discorso fatto ad inizio lezione, ovvero una volta che si è imboccata una strada, in questo caso una condizione dell’if, non si può intraprendere l’altra.

38
Q

1 L’if può esistere anche senza else, ma fai attenzione!

A

Guarda il seguente esempio:

var a = 2

var b = 3

if (a > b) {

print(“a è maggiore di b”)

}

print(“b è maggiore di a”)

La variabile “a” è minore della variabile “b” quindi non potrà essere mai eseguito quell’if. In questo caso il blocco dell’if viene saltato e viene eseguita l’istruzione sotto.

Però, quando la variabile “a” è maggiore della var “b” entra dentro l’if ma viene anche eseguita l’istruzione sotto.

Questa sintassi viene utilizzata solamente per eseguire delle azioni che non compromettono il funzionamento del resto del codice. O in alcuni casi particolari che vedrai quando studierai le funzioni in Swift.

Ad esempio, immagina che un sistema informatico permetta di farti accedere ad un’area segreta solo quando inserisci una password:

let password = “123”

var passwordInserita = “888”

if (passwordInserita != password) {

print(“Non puoi entrare nell’area protetta”)

}

print(“Benvenuto nell’area protetta”)

var contoSegreto = 1000

print(“Nel tuo conto ci sono: (contoSegreto) euro”)

password è la password per accedere al sistema.

passwordInserita è la password che l’utente dovrebbe inserire.

La password per accedere al sistema deve essere uguale a “123”.

Le due password, essendo diverse, attivano l’if che prontamente ti avvisa che non puoi entrare nell’area protetta. La cosa strana è che succede quello che non vorremmo succedesse mai ad una nostra applicazione. Ovvero, così come l’ho scritto il codice ti farà entrare sempre nell’area segreta.

Questo accade perché il codice che si trova dopo l’if è direttamente collegato a ciò che l’if dovrebbe controllare.

Sapresti risolvere questo problema con le conoscenze attuali?

Avresti potuto prevenire il problema utilizzando un if-else:

let password = “123”

var passwordInserita = “123”

if (passwordInserita != password) {

print(“Non puoi entrare nell’area protetta”)

} else {

print(“Benvenuto nell’area protetta”)

var contoSegreto = 1000

print(“Nel tuo conto ci sono: (contoSegreto) euro”)

}

print(“Fine del programma”)

39
Q

2 Circoscrivi tutti i possibili casi d’errore e d’interesse

A

L’if else in Swift nasce principalmente come sistema di controllo (lo vedrai meglio nella prossima lezione) più che di scelta. O meglio la scelta è subordinata al tipo di controllo.

Non c’hai capito na mazza? Tranquillo, neanche io!

Ti faccio un esempio.

Se ti dicessi di sommare numeri con lettere di sicuro mi diresti che è impossibile.

Il problema è che il Playground, come qualsiasi altro compilatore, non è in grado di dirti: “Ehi senti! Questa operazione non la puoi fare”.

In realtà ci riesce, però lo fa sotto forma d’errore che può compromettere il funzionamento dell’applicazione o programma (vedrai come risolvere questo errore a fine corso).

La maggior parte dei crash delle applicazioni sono dovuti a errori non controllati.

Ad esempio, un errore famosissimo, che puoi studiare con le conoscenze che hai adesso, è la divisione di un numero per 0.

Il 21 Settembre 1997, la nave da guerra americana USS Yorktown, ha visto andare in crash tutti i suoi sistemi informatici, che gestivano il comparto missilistico, a causa di una divisione per 0.

L’errore, che poteva essere fatale (si parla di missili), è imputato a chi ha progettato il sistema. Il quale non ha tenuto conto di tutti i casi possibili d’errore.

C’è da dire però che il linguaggio Swift, come altri linguaggio simili, è stato progettato per trattare questa tipologia d’errori.

Quindi anche se non prenderà a fuoco il tuo Mac è giusto analizzare uno dei più grandi problemi che ha afflitto i programmatori delle generazioni passate.

40
Q

Opzionalità in Swift. Essere o non essere, questo è il dilemma

A

Essere o non essere. Il dubbio amletico ha causato non so quanti problemi ai linguaggi di programmazione come Swift.

Il problema, che nella tragedia si riconduce al vivere o morire, nel linguaggio di programmazione Swift assume una connotazione un po’ diversa ma dal risultato decisamente simile.

La faccio breve!

Sai definire il niente o il nulla?

No. Se stai pensando al numero zero stai completamente andando fuori strada. Il numero 0 infatti è un numero che ha la funzione di rappresentare il non valore.

Cioè se hai una torta composta da 4 fette, dire che la torta ha zero fette vuol dire che è finita ma non che non esiste.

Qui la questione è un po’ più ampia e riguarda la possibilità di poter descrivere la non presenza di sostanza tramite il linguaggio Swift. Nell’esempio della torta, questo concetto, potrebbe essere inteso come la non presenza né della torna né tantomeno del piatto. Entriamo subito nel vivo della questione, analizzandolo con il linguaggio Swift.

Ti ricordi come nella lezione delle variabile e costanti ti ho fatto notare la differenza tra dichiarare e inizializzare?

Dichiarare significa creare una variabile senza assegnargli nessun valore:

1

var variabile_dichiarata: Int

Inizializzare significa assegnare un valore alla sua creazione:

var variabile_inizializzata = Int() // INIZIALIZZALA LA VARIABILE CON VALORE 0

var unAltraVar_inizializzata = 2 // INIZIALIZZA LA VAR A VALORE 2

Sei mai riuscito a sommare quattro patate con il nulla?

print(variabile_dichiarata) // erroree

variabile_dichiarata+2 // erroreeeee!!!

La variabile_dichiarata in questo momento si trova nello stato di “non presenza di valore” e non contenendo valore il linguaggio Swift non è in grado di poter eseguire delle operazioni.

Ecco il motivo per cui il Playground mostra l’errore: “variabile_dichiarata non inizializzata“.

Peppe, non potevo evitare ogni problema inizializzando la variabile?

Più o meno. Fino ad ora inizializzare una variabile in Swift non costa nulla né in termini di tempo né in termini di risorse. Risorse?

Eh si! Perché inizializzare una variabile con il Playground, e in futuro con la tua applicazione, consumerà un po’ di memoria, cpu e ovviamente tempo.

Poi, c’è un altro motivo, perché dovrei inizializzare una variabile prima del suo reale utilizzo? Cioè se una variabile la utilizzerai dopo 2876 righe di codice, perché farla nascere prima del tempo?

Queste domande sono venute anche ai cervelloni della Apple. Motivo che li ha portati ad inventare un sistema chiamato Opzionalità del linguaggio Swift (In realtà è solamente una rivisitazione molto semplificata di sistemi adottati in altri linguaggi).

Cosa fa questa Opzionalità in Swift?

In poche parole, l’opzionalità del linguaggio Swift, ti permette di definire un valore al concetto di non valore.

Pronto? Allora vediamo insieme cos’è l’opzionalità in Swift e come utilizzarla.

41
Q

I marcatori “?” e “!”. Definire e gestire l’opzionalità in Swift

A

Immagina d’avere appena aperto un nuovo conto in banca. La commessa, prima di andartene, ti domanderà: “Vuole mettere dei soldi sul suo conto o lo lasciamo a zero?”

In questo momento il tuo conto si trova nell’essere in bilico tra l’avere dei soldi o non averne:

Forse avrò dei soldi.

Forse non ne avrò.

Cioè, se la tua applicazione serve a gestire un salvadanaio, nel tuo codice Swift equivarrebbe a definire e dichiarare una nuova variabile chiamata contoInBanca:

1

var contoInBanca: Double

Non potevo mettere zero come valore di default?

Verissimo pure. Ma, se ci pensi, anche lo zero è un valore.

La questione, dunque, ha un’importanza ancora più ampia e profonda di quella che ho provato a descriverti con questo semplicissimo esempio. Man mano che ti addentrerai nel corso sul linguaggio Swift e nel corso di sviluppo applicazioni iOS ti renderai conto dell’importanza di questo strumento.

L’opzionalità in Swift hai capito che risolve il problema, vediamo come!

42
Q

Question Mark: come rendere opzionale una variabile con il marcatore “?”

A

Dire che una variabile è opzionale significa che ha un valore universale che simboleggia l’assenza di valore.

La parola chiave o keyword dell’assenza di valore è: nil (tradotto: il nulla). Dunque, dirai che la variabile è opzionale, o ha valore nil, quando essa ha come valore nil.

var variabileNil = nil

print(variabileNil)

Voglio sottolineare che, una variabile opzionale, non assume valore 0. Per il linguaggio Swift, nil e zero (e Void dei linguaggi C based) sono concetti totalmente differenti.

Come faccio a rendere una variabile opzionale?

Puoi attivare l’opzionalità in Swift aggiungendo il simbolo punto interrogativo (?) davanti al tipo di dato di una variabile. Il Question Mark, o punto interrogativo, rende opzionale una variabile:

var contoInBanca: Double?

print(contoInBanca)

Rendendo opzionale la variabile, quest’ultima assume il valore simbolico di nil. Nel tuo playground apparirà il valore nil come valore di default della variabile contoInBanca.

A questo punto dovrebbe essere chiare 2 cose:

La semplice dichiarazione di una variabile non rende opzionale la variabile.

Per rendere opzionale una variabile bisogna utilizzare solamente il question mark.

Adesso prova ad assegnare un valore alla variabile opzionale ed a stampare il suo contenuto:

var conto_banca: Double? = 4

print(“Nel mio conto ci sono: (conto_banca) euro”)

// Nel mio conto ci sono Optional(4.0) euro

Quando provi a stampare il contenuto di una variabile opzionale accade qualcosa di inusuale.

Ovvero viene stampato il contenuto della variabile dentro la dicitura Optional(valoreVariabile). Questo succede perché una variabile opzionale si presenta con una duplice forma:

Da un lato non possiede valore, quindi il suo contenuto è nil.

Dall’altro può contenere qualsiasi valore (del tipo specificato). Nell’esempio sopra la variabile è opzionale ma possiede il valore 4.

Il linguaggio Swift non è in grado di capire quale delle due forme stai utilizzando. Per questo motivo, previene il problema, dicendoti che all’interno della variabile c’è un valore opzionale.

Il Playground, con la dicitura Optional(valoreVariabile), preferisce dirti: “Ehi, il valore c’è però potrebbe non esserci“.

L’opzionalità in Swift fa da involucro al valore contenuto della variabile.

43
Q

Unwrap di un optional value: accedere al contenuto di un variabile opzionale con il marcatore “!”

A

La variabile opzionale non gode delle proprietà che hanno le variabili normali. Operazioni come la somma, divisione, ecc. non possono essere eseguite se lasciate in questa forma:

conto_banca + 2 // ERRORE

Il linguaggio Swift non è in grado di capire se vuoi accedere al contenuto della variabile oppure se vuoi continuare a considerarla come opzionale.

Devi farglielo capire. Per farlo necessario esplicitare che vuoi accedere al valore reale contenuto dalla variabile opzionale.

Lo strumento per trattare la variabile opzionale come una normale var si chiama Unwrap. Consiste nell’estrapolare il valore, qualora presente, della variabile opzionale ed a trattarlo come un valore non opzionale.

Il marcatore in è il “!“. Va inserito dopo il nome di una variabile quando vuoi toglierle momentaneamente l’opzionalità:

print(“Nel mio conto bancario ci sono: (contoInBanca!) euro”)

// Nel mio conto bancario ci sono: 4 euro

Il compilatore, prende la variabile opzionale, legge il valore, capisce che è un optional e con il marcatore “!” entra ancora più in profondità assicurandosi che realmente quel valore esista.

L’unwrap prende la faccia della medaglia che gestisce il valore reale e lascia perdere la faccia opzionale.

Perché è importante?

L’unwrap di un valore opzionale serve per non mandare in confusione il compilatore, guarda questo esempio:

var mieiSoldi: Int? = 4

var altriMieiSoldi: Int? = 5

var soldiTotali = mieiSoldi + altriMieiSoldi // ERRORE

La somma di due variabili opzionali genera errore perché il compilatore non sa quello che deve fare: “Non so se prendere il valore nil oppure sommare i valori contenuti nelle var“.

Quindi con l’unwrap forzi il compilatore ad usare i valori reali delle due variabili:

var soldiTotali = mieiSoldi! + altriMieiSoldi!

print(soldiTotali)

44
Q

1# Nel dubbio l’opzionalità non guasta mai

A

A fine corso scrivere le variabili opzionali diventerà prassi, inizia a farlo da adesso

var nome: String?

var cognome: String?

var età: Int?

var a: Double?

var b: Double?

Previeni un’infinità di problemi e rendi il codice più fluido da leggere. In più eviti di dover inserire dei valori di default.

45
Q

2# I valori di un dizionario sono di default optional

A

In un dizionario, il “valore” associato alla “chiave” è un’informazione che, di default, è opzionale. Ovvero se è vuoto o no non fa differenza.

Ora hai capito perché nell’esempio della lezione Array e Dizionari in Swift spuntava Optional(valore). Ora sai che può essere risolto con l’unwrap:

var dizionario = [

“informatica”: “scienza che studia l’uso della tecnologia”,

“albergo”: “una struttura delegata alla ricezione di ospiti”,

“giuseppe”: “nome proprio di persona”

]

print(dizionario[“albergo”]!)

[su_spoiler title=”Esempio divina commedia” style=”fancy”]

var divinaCommediata: [Int: String] = [

1: “nel mezzo del cammin di nostra vita”,

2: “mi ritrovai per una selva oscura”,

3: “ché la diritta via era smarrita”

]

print(divinaCommediata[1]!)

[/su_spoiler]

46
Q

3# Optional Binding: prevenire gli errori dell’opzionalità

A

Anche con l’opzionalità in Swift comunque ci sono dei problemi. Uno tra questi è quello di tentare ad Unwrappare una variabile opzionale che non ha assegnato nessun valore.

var peso: Int?

print(“il mio peso è (peso!)”) // ERRORE

Qual è lo strumento che conosci per poter controllare il codice?

Esatto! L’if-else potrebbe risolvere questo spiacevole inconveniente.

Dato che di default il valore di una variabile opzionale è nil, potresti controllare la sua presenza o meno e quindi unwrappare il valore solo nel primo caso (ho usato questo stratagemma nell’esercizio sul login da guest):

var peso: Int?

if peso != nil {

print(“il mio peso è (peso!)”)

} else {

print(“inizializza la variabile peso”)

}

Esiste un altro sistema!

Puoi compattare, all’interno dell’if, l’unwrap di un valore opzionale.

All’interno dell’if si assegna il contenuto della variabile opzionale ad una variabile/costante creata e dichiarata all’interno della condizione dell’if. Se la variabile opzionale ha un valore, allora la varlo prende e lo conserva, altrimenti scatta l’else.

Forse faccio prima a fartelo vedere:

if let unwrap_peso = peso {

print(unwrap_peso)

} else {

print(“inizializza la variabile peso”)

}

La costante unwrap_peso nasce all’interno della condizione dell’if e può essere utilizzata solo all’interno del blocco dell’if. Nasce e muore esclusivamente per leggere il valore della variabile opzionale.

Nota come non viene eseguito un confronto, cioè non viene utilizzato il simbolo (==), bensì un passaggio di valore.

Quest’operazione può essere letta nella seguente maniera: “se la variabile non è nil allora assegna il contenuto alla costante, altrimenti passa all’else“.

Puoi utilizzare entrambe le sintassi senza nessuna distinzione.

Tra le due possibilità di unwrap è comunque preferibile utilizzare l’optional binding (il secondo sistema, quello con if let nomeCostanteTemporanea = varOpzionale).