Compatibile con Xcode 8

Istruzione guard in Swift. Un’istruzione di controllo sicura ed elegante

Chi non vorrebbe una guardia del corpo?

Le guardie servono per il controllo di qualcosa o qualcuno. Per il linguaggio Swiftquando si parla di controllo del codice si pensa immediatamente all’if else e allo switchSai che entrambi i sistemi sono efficientissimi e che permettono di eseguire delle porzioni di codice in base al verificarsi di una condizione.

E se ti dicessi che esiste una nuova istruzione di controllo e, per certi versi, migliore?

La nuova istruzione di controllo, che oggi ti introdurrò, si chiama guard ed offre un sistema veloce ed elegante per performare un’azione solo quando una condizione non è verificata. La sua sintassi è la seguente:

E adesso mi dirai: a parte la sintassi dove sta la novità?

La particolarità dell’istruzione guard in Swift, sta nel fatto che, una volta che l’esecuzione del codice è entrata all’interno del blocco else, non si può più uscire se non con un’istruzione di trasferimento (break, return, continue, ecc.).

Questa clausola impone già un vincolo significativo.

L’istruzione guard può essere utilizzata solo all’interno delle funzione, dei cicli e delle altre componenti che vedrai più avanti (come classi e strutture). Di fatto non è un vincolo. Quando ti ritroverai, nel prossimo corso, a sviluppare la tua prima applicazione ti accorgerai che tutto il mondo gira grazie alle funzioni (e agli elementi delle prossime lezioni).

Mettiamoci subito all’opera e vediamo in cosa consiste l’istruzione guard con il linguaggio Swift!

Istruzione guard linguaggio swift

Istruzione Guard in Swift: imparare ad utilizzare la giusta istruzione di controllo

L’istruzione guard in Swift permette di performare un’azione solo quando la sua condizione non è verificata (ovvero è false).

Immagina d’aver creato una funzione per il controllo degli elementi presenti in un array. La funzione restituisce false, quindi esce dalla funzione, se non trova l’elemento intruso passato al parametro della funzione:

La funzione, al suo interno, esegue un ciclo for in che scorre gli elementi dell’array. L’istruzione guard controlla che l’elemento letto dal ciclo sia diverso da quello passato nel parametro intruso e, se lo è, l’esecuzione passa oltre.

Quando il ciclo troverà l’elemento “intruso“, nell’esempio è -1, la condizione dell’istruzione guard non sarà più verificata e l’esecuzione entrerà dentro il suo blocco else. Entrare dentro il blocco else, dell’istruzione guard, significa poterne uscire solo con un trasferimento (return, break, continue, ecc.). 

Nel nostro caso, il blocco else, prima stampa dei messaggi d’avviso e poi esce dalla funzione ritornando true.

Puoi leggere l’istruzione guard del linguaggio swift in questa maniera: “Se la condizione non è verificata (guard) esegui quest’operazione (else)”.
Lo stesso esercizio con if-else:

Optional Binding con l’istruzione guard in Swift

L’Optional Binding, introdotto nella lezione sull’opzionalità in Swift, è lo strumento utilizzato per estrapolare e controllare la presenza di un valore in una variabile opzionale. 

Questo strumento è molto utilizzato dagli sviluppatori perché previene la nascita di errori derivati dalla non presenza di valore in una variabile opzionale.

 

Con l’istruzione guard in Swift è possibile eseguire l’optional binding in maniera decisamente più efficiente rispetto a quanto imparato a fare con l’istruzione if. Il principio è sempre lo stesso.

Nella condizione dell’istruzione si istanzia una costante con il valore delle variabile opzionale. La costante è in grado di estrapolare la parte reale della variabile opzionale:

Una cosa importante, e che puoi notare dall’esempio, è che la costante definita dentro l’istruzione guard, può essere utilizzata anche all’esterno del suo blocco (cosa che con l’if-else non è permesso). Infatti la print finale stampa il contenuto della costante nonOpzionale.

Se adesso provassi a fare lo stesso esercizio con l’istruzione if-else, ti accorgeresti come la forma stilistica sia leggermente più confusionaria rispetto a quella creata con la keyword guard:

Quindi, già a prima vista, si nota facilmente come l’istruzione guard permette di scrivere codice in maniera più elegante.

Nel primo caso, anche non conoscendo il funzionamento dell’istruzione, si capisce che il compito finale della funzione è proprio quello di salutare qualcuno. Invece, nell’esempio dell’if-else non è facilmente deducibile perché il fine ultimo della funzione è contenuto all’interno del blocco if.

Ora per farti amare quest’istruzione, analizziamo un problema più complicato e che richiede un po’ di controlli per poter essere portato a compimento.

Esercizio 0. Crea la funzione che genera il codice fiscale unendo tre parametri d’ingresso (nome, cognome, età). La funzione restituisce il codice fiscale in uscita o nil nel caso d’errore.

Tutte le istruzioni guard estrapolano il valore reale delle variabili utilizzando l’optional binding. Se qualcuna di queste non dovesse farlo perché il parametro è opzionale, si verrebbe catapultati fuori dalla funzione. Infine, se non ci sono stati problemi di binding, verrà restituito il codice fiscale.

Guarda invece cosa avresti scritto con l’istruzione if else.

Esercizio 1. Risolvi l’esercizo 0 con l’if else.

Esercizi svolti

Proviamo ad utilizzare l’istruzione guard in Swift. Dai un’occhiata a questi esercizi e se trovi dei problemi o qualcosa che non capisci, fammelo sapere con un commento.

Esercizio 2. Contare gli elementi positivi in un array

Dato un’array di interi, crea una funzione che conta il numero di elementi positivi all’interno dell’array e restituisca tale numero.

Ti ricordo che l’istruzione “continue” significa: “Vai al ciclo successivo”.

 

Esercizio 3. Controllare e correggere gli stipendi dei tuoi dipendenti.

Dato un dizionario con chiave il nome del tuo dipendente e con valore lo stipendio, crea una funzione che controlla lo stipendio del dipendente. In particolare, se lo stipendio è minore di 0 lo cambia e corregge inserendogli 0 come valore di default.

 

Esercizio 4. Sistema di login utente e guest.

La funzione di login accetta in ingresso un id ed una password. L’id è una stringa opzionale e la password un intero opzionale.

  • Se l’id non è specificato ed è nil, la funzione stampa che l’utente è entrato come guest.
  • Se l’id esiste è la password è nil, la funzione stampa che la password è incorretta.
  • Altrimenti stampa “loggato come utente” e i suoi dati di ingresso.
Ti ricordo che il simbolo underscore ( _ ) viene utilizzando quando non si ha bisogno di definire una variabile. In questo caso a noi non interessa estrapolare il valore reale dei parametri opzionali e per tanto utilizziamo l’underscore.

La cosa importante da notare in questo esercizio è che non ho avuto bisogno di concatenare più istruzioni (tipo un if-else if). Mi è bastato seguire la propeduticità delle condizione.

 

optional binding istruzione guard in swift

Esercizi della lezione e ricapitoliamo

L’istruzione guard in swift offre un sistema più elegante e funzionale per la gestione di determinate condizione. Non è obbligatorio utilizzare il guard in tutti i codici anche se, devo dirlo, a me piace tantissimo!

Ricapitoliamo

  • L’istruzione guard in Swift sostituisce l‘if else in certe condizioni.
  • Il guard serve ad eseguire un blocco d’istruzioni solo quando la sua condizione non è verificata.
  • La sintassi dell’istruzione guard in Swift è: “guard <condizione> else {<istruzioni>+<istruzione di trasferimento>}“.
  • Una volta che l’esecuzione è entrata dentro il blocco else, dell’istruzione guard, è impossibile proseguire senza trsferimento.
  • Si esce dal blocco else solo se si utilizza un’istruzione di trasferimento (return, break, continue…).
  • L’optional binding con il guard è più funzionale rispetto al rispettivo con if else.
  • Una variabile/costante definita all’interno della condizione può essere utilizzata anche dal resto del codice.

Esercizi della lezione

Come esercizi, puoi provare a rifare tutti quelli delle lezioni precedenti utilizzando le funzioni e l’istruzione guard in Swift. In alternativa, ti lascio questi:

  • Esercizio 5. Una funzione stabilisce se una stringa è una email oppure no.
    La funzione controlla ogni singolo carattere e se trova il carattere “@” e successivamente il carattere “.” ne deduce banalmente che, la stringa passata come parametro, è una email.
    P.S. per leggere ogni carattere della stringa utilizza il for in ( esempio: var stringa = “ciao@ciao” – for carattere in stringa.characters {} ).

Qualora dovessi trovare delle difficoltà o dei problemi nella lezione o negli esercizi, lascia un commento.

Buona Programmazione!

Changelog

  • 15/10/2016 – Aggiunto il changelog. Verifica compatibilità con Xcode 8 e linguaggio Swift 3.0.

Torna a: Corso gratuito linguaggio di programmazione Swift > Dai controlli alle funzioni del linguaggio Swift

Start typing and press Enter to search

Opzionalità in Swiftgestione-errori-in-swift