Se qualcosa va bene allora faccio così, altrimenti… Quante volte ti è capito di ragionare così? 🤔

Questo modus operandi lo ritroviamo anche all’interno dei linguaggi di programmazione.

Il linguaggio Swift ti mette a disposizione due keywords, if ed else, che ti permetteranno di eseguire o meno dei blocchi di codice in base allo stato di una condizione.

Grazie all’istruzione if-else riuscirai a variare il comportamento della tua applicazione iOS.

Esempio: vogliamo far entrare gli utenti all’interno della nostra app solamente quando inseriscono email e password. Questa operazione, potremmo implementarla, sfruttando un’istruzioni if-else:

Ti do un’assaggio ⤵️

Esempio if else linguaggio swift

If significa “se” mentre else “altrimenti”.

Quindi anche senza saperla utilizzare, leggendo puoi già capire cosa succede.
“Se email è uguale a …. && la password è uguale a ….” allora esegui quest’operazione. Else, se l’if non è valido, fai quest’altra cosa.

Ma procediamo con ordine!

Vediamo insieme come utilizzare l’istruzione if else con il linguaggio Swift 💪

Operatori di confronto

Per capire l’if else con il linguaggio Swift devo innanzitutto presentarti gli operatori di confronto.

Apri il tuo Playground e crea queste due semplici variabili:

var a: Int = 2
var b: Int = 3

Gli operatori di confronto o anche condizionali, sono dei simboli che ti permetteranno di eseguire operazioni tra due variabili/costanti. Operazioni che restituiranno, come risultato, un valore Booleano.

I simboli sono i seguenti:

a == b // uguale a
a != b // diverso da

a > b // maggiore di
a < b // minore di

a >= b // maggiore ed uguale di
a <= b // minore ed eguale di

Il risultato dell’operazione è un Bool, quindi true o false. Dipenderà esclusivamente dall’operatore usato e dai valori messi a confronto.

Per capire il risultato ad occhio, senza dover eseguire, devi leggere l’operazione da sinistra verso destra.

Esempio:

var a: Int = 2
var b: Int = 3

a > b // a è maggiore di b?
// il risultato è false.

Nel nostro caso si leggerà: “a è maggiore di b“. Cioè il valore dentro la var a è maggiore del valore dentro la var b?

Siccome 2 è minore di 3, il risultato sarà false.

Confronto tra String

Se per i numeri è abbastanza semplice capire il risultato dell’operazione, per le stringhe tutto si complica un po’.

E quando mai? 😂

Quello a cui devi far attenzione è l’operazione di maggiore e minore di.

Prendiamo un esempio:

var x: String = "a"
var y: String = "b"

x > y
x < y

Durante un’operazione di confronto tra stringhe vengono controllati carattere per carattere in ordine lessicografico. Quindi, “x > y” è false perché “b” viene dopo “a”.

Cosa succede se la stringa x è più grande della y?

x = "ab"
y = "b"

x > y

L’operazione continuerà a generare false perché, dato che vengono confrontati carattere con carattere, il primo confronto “a > b” genererà false e quindi si interromperà lì il confronto.

Chiaro? 😱

Se controllerai sempre i singoli caratteri ti assicuro che non sbaglierai. Comunque, se ci sono dei problemi, al solito mi puoi scrivere un commento.

La sintassi dell’if-else

Gli operatori di confronto sono alla base dell’istruzione if-else. Partiamo dalla sintassi:

if () {

} else {

}

Questo è il pattern che dovrai rispettare. Ma non è ancora completo.

All’interno delle tonde dovrai aggiungere una condizione booleana. Cioè un’operazione che genererà un bool (dovrai usare gli operatori visti poco fa).

Se la condizione sarà:

  1. true, attiverà il codice dentro il blocco di parentesi dell’if
  2. false, attiverà il blocco dell’else

Esempio 1

Facciamo subito un esempio.

Vogliamo far entrare il nostro utente all’interno della sezione adult 😈 solo se ha più di 25 anni. Altrimenti, va nella kids.

Come risolviamo questo problema?

Ci serve un if-else. If, se l’età dell’utente è maggiore di 25, entri dentro le sue graffe. Else, altrimenti no:

var età: Int = 25

if (età > 25) {
    print("benvenuto nella sezione Adult")
} else {
    print("benvenuto nella sezione Kids")
}

Domanda. Con questo codice, dove andrà a finire l’utente? (gioca un po’ cambiando i valori di età)

Esempio 2

L’utente deve inserire la password in due campi di testo. Dobbiamo controllare che queste combacino ed, eventualmente, avvisarlo dell’errore.

Ci serve anche qui un if-else.

var password: String = "ciao"
var password2: String = "ciao"

if (password == password2) {
    print("le due password sono uguali")
} else {
    print("le password sono diverse")
}

In questo caso ho usato l’== perché le due password devono essere identiche.

Dentro un’app tu avrai sempre questa istruzione solamente che poi dall’if-else interagirai con l’interfaccia e manderai un avviso all’utente (esempio colorando di verde i bordi dei due campi se le psw combaciano o di rosso altrimenti)

L’ordine del codice

L’ordine ed il posto in cui viene inserito il codice è fondamentale. FONDAMENTALE.

E ti faccio subito capire perché.

Riprendiamo l’esempio delle password. Ipotizziamo che l’inserimento delle password comporti l’accesso ad un conto bancario:

var password: String = "ciao"
var password2: String = "ciao"

if (password == password2) {
    print("Benvenuto")
} else {
    print("Non puoi entrare")
}

let conto: Double = 100.0
print("Utente, il tuo conto è di \(conto)")

Cosa c’è di sbagliato? Le password sono uguali, non viene attivato l’else, e viene stampato il valore del conto.

Il compito di noi sviluppatori è quello di controllare sempre, e dico sempre, tutti i possibili casi d’utilizzo 😎.

Cosa accade se le password sono diverse?

Qualsiasi utente può visualizzare il conto corrente. E questo è e può diventare un grossissimo errore.

Come fare allora?

Se sposti il codice dell’accesso al conto dentro l’if, allora avrai risolto il problema.

var password: String = "ciao"
var password2: String = "ciao"

if (password == password2) {
    print("Benvenuto")
    let conto: Double = 100.0
    print("Utente, il tuo conto è di \(conto)")
} else {
    print("Non puoi entrare")
}

Quindi, in base a ciò che vuoi realizzare, se hai degli if-else ricordati di verificare l’ordine del codice.

  • Tutto ciò che è relativo alla condizione di true, va inserito dentro il blocco if
  • Se è relativo alla condizione false, dentro l’else
  • Se vuoi un codice per tutti e due i casi, va messo sopra o sotto l’istruzione if-else.

Lo Scope delle variabili

Ogni blocco di paratesi graffe crea una divisione con il mondo che ci sta all’esterno.

La regola è abbastanza semplice.

Dall’interno di un blocco puoi accedere alle cose che sono all’esterno. Viceversa no.

Questo significa che, da dentro un if, puoi accedere alle variabili/costanti che si trovano all’esterno. Viceversa no.

Ti faccio un esempio:

let numberA: Int = 0

if (a == 0) {
   print("la let numberA vale \(numberA)") // posso accedere a numberA
   let numberB: Int = 15
}

print(numberB) // non posso accedere alla let numberB

Da questo esempio deduciamo che lo scope di una var/let, cioè la sua visibilità, è relativa solamente al blocco corrente o a relativi blocchi interni.

Psss stai avendo qualche problema ad utilizzare l’istruzione if else con il linguaggio Swift?
Scrivimi pure un commento in fondo alle lezione, non mordo 😘

If senza else

Un if può esistere senza l’else. In alcuni casi capiterà di voler controllare solamente la condizione true e mai l’altra.

Quindi potrai scrivere:

let userSelectOptionalCheckbox: Bool = true
if (userSelectOptionalCheckbox) {
   // perfetto l'utente ha selezionato il checkbox opzionale
}

Durante lo sviluppo delle nostre app probabilmente incontreremo questa sintassi.

Annidare gli if

Immaginiamo di voler far registrare il nostro utente solamente quando inserisce password, email ed ha selezionato il checkbox.

let emailAdded: Bool = true
let passwordAdded: Bool = true
let isCheckboxActive: Bool = true

Ci serve dunque un if che esegua più controlli contemporaneamente.

Attualmente potremmo risolvere questo problema, mettendo dentro l’if altri if:

if (emailAdded) {
    if (passwordAdded) {
        if (isCheckboxActive) {
            // entrerò qui quando email, password e checkbox saranno true
        }
    }
}

In pratica, annidando gli if, puoi creare delle condizioni a cascata. Se emailAdded è true entra dentro, se passwordAdded è true entra dentro il suo blocco (quindi sia l’email che la psw sono true) ed infine un altro if ci assicura che entrerà dentro il suo scope quando tutte e tre le condizioni sono true.

Ma è la soluzione corretta? 🤔

Si, ma c’è un sistema migliore.

Operatori logici: And ed Or

Il simbolo && (che si legge And) può essere usato per definire un controllo in cui due condizioni devono essere entrambe true per procedere.

Esempio, se l’email && la password sono true allora entra dentro l’if, altrimenti attiva l’else (se presente):

if (emailAdded && passwordAdded) {
    print("email è password inserite")
} else {
    print("o l'email o la password non sono state inserite")
}

Dall’altro lato, il simbolo || (che si legge Or) verifica la condizione dell’if quando una delle due condizioni è true:

emailAdded = false
passwordAdded = true 

if (emailAdded || passwordAdded) {
    print("o l'email o la psw sono state inserite")
}

Più di una condizione

Nessuna ti vieta di inserire all’interno dell’if più operatori logici, uguali o diversi che siano.

if (emailAdded && passwordAdded && isCheckboxActive) {
    // tutte e tre devono essere true
}

Oppure, possiamo utilizzare le parentesi per creare istruzioni di controllo più complesse.

Esercizio 0. Mi sai dire in quali casi l’utente entra dentro il blocco?

let emailAdded: Bool = false
let passwordAdded: Bool = false

let isGuest: Bool = true

if ((emailAdded && passwordAdded) || isGuest) {
    if (emailAdded && passwordAdded) {
        // chi entra qui?
    } else {
        // chi entra qui?
    }
}

Operatore Not

Non amo particolarmente questo operatore, perché può portare un po’ di confusione. Però devo mostrartelo perché in alcune circostante potrai ritrovarlo.

L’operatore Not, che si esprime con il punto esclamativo, calcola l’opposto di un valore booleano:

var bool: Bool = true
!bool // false

Il Not va messo prima di un valore Bool. Se la var è true considera il false o viceversa.

Dentro un’istruzione if, il Not altera il modo in cui funziona la condizione. Se fino a questo momento l’if si attivava con un risultato di tipo true, utilizzando il Not si attiva con un false.

let name: String = "giuseppe"

if (name.isEmpty == false) {
    print("La var name è piena")
}

if (!name.isEmpty) {
    print("La var name è piena")
}

L’istruzione if (!name.isEmpty) puoi leggerla come: “Se il name is not empty entra dentro il blocco“.

Nell’esempio, name.isEmpty è false. Grazie al Not abbiamo esplicitamente chiesto di entrare dentro l’if quando isEmpty è false. (cioè è == false, che fa true).

If – else if

Se tutto questo ti sembra complesso, è perché ancora non hai visto l’istruzione if – else if 😭.

Un if può avere anche più di un blocco di controllo. Cioè, puoi scrivere diversi if a cascata.

Ipotizziamo che stai creando un gioco e vuoi avvisare il player che la sua salute sta scendendo rispetto a diverse soglie critiche.

Se la vita è:

  • == 0 è morto
  • > 0 < 30 è con salute bassa
  • >= 30 è in ottima salute

Siccome solamente una delle tre condizioni può essere verificata, puoi scrivere la tua istruzione così:

var playerLife: Double = 30

if (playerLife == 0) {
    print("morto")
} else if (playerLife > 0 && playerLife < 30) {
    print("salute bassa")
} else if (playerLife >= 30){
    print("sei in ottima salute")
} else {
   print("qualcosa è andato storto, la vita è minore di zero")
}

In pratica, subito dopo l’if, puoi aggiungere un altro blocco if utilizzando la sintassi else if (nuovaCondizione).

Le istruzioni verranno verificate a cascata. La prima che verrà verificata verrà eseguita.

Nessuno ti vieta di scrivere anche altri else if. Alla fine, comunque, potrai aggiungere un else per acchiappare tutti i casi non controllati dall’if ed else if.

Istruzioni separate?

Puoi scrivere le istruzioni anche come if separati. L’unica differenza è che mettendo le sequenze di else if solamente uno degli if verrà verificato.

Mentre, mettendoli separatamente, potrebbe capitare che si attivino più di un if.

Esercizio

Data una variabile Int che rappresenta il volume di un altoparlante (var volume: Int = 0) crea il codice che controlla il volume dell’altoparlante.

In particolare, se il volume è:

  • Maggiore di 35, scriverà sulla console che “il volume è troppo alto”.
  • Minore di 35 ma maggiore di 10, scriverà “il volume è medio alto”.
  • Minore di 10 e maggiore di 0, scriverà che “il volume è normale”.
  • Uguale a 0, dirà che “il dispositivo è spento”.
  • Minore di 0, “non puoi inserire un volume negativo”.

Per qualsiasi dubbio e chiarimento, scrivi un commento 💪

Conclusione

Con l’istruzione if else, del linguaggio Swift, finalmente facciamo un piccolo passo in avanti verso la scrittura di codice più complesso.

Il controllo del codice è qualcosa da non prendere alla leggera.

Passerai gran parte del tuo tempo a verificare il comportamento dell’app in base alle diverse azioni che compiranno gli utenti.

Si, ti sto dicendo che scriverai tantissimi if else (anche se, più avanti, vedrai che esiste un’alternativa più elegante che è l’istruzione guard) 😂

Buona Programmazione!

Back to: Swift Tour: Corso gratuito linguaggio di programmazione Swift > Le basi del linguaggio Swift

🔥
Iscriviti al corso
Segui le lezioni, completa gli esercizi ed ottieni l’attestato

👨‍💻
Hai bisogno d’aiuto?
Scrivi un commento in fondo alla lezione

 

L’unica domanda stupida è quella che non si fa! 

TUTORIAL A CURA DI

Giuseppe Sapienza

Ti è piaciuto l’articolo?
Condividilo con i tuoi amici Dev

Condividi su facebook
Condividi su twitter
Condividi su linkedin
Condividi su telegram