Il costrutto guard in Swift

512_radioactiveIl costrutto guard permette di verificare che una certa condizione sia verificata, in caso contrario il flusso di esecuzione viene terminato.

Si tratta di un concetto da non confondere con l’istruzione assert che provoca sempre un fatal error e la conseguente terminazione dell’esecuzione dell’intera app.

Al contrario guard permette di eseguire il codice che vogliamo nel caso in cui la condizione da verificare non sia soddisfatta. L’unica condizione è che venga terminato il flusso attuale.

La sintassi prevede:

  1. la keyword guard
  2. seguita da un espressione
  3. seguita dalla keyword else
  4. e quindi un blocco di codice che deve obbligatoriamente terminare il corrente flusso di codice.

guard ESPRESSIONE else { CODICE PER TERMINARE IL FLUSSO }

sum

Vediamo un esempio. Dobbiamo implementare la funzione sum cosi definita

La funzione riceve 2 parametri di tipo String. Se entrambe le stringhe rappresentano degli interi validi allora deve restituire la loro somma. Altrimenti nil.

Una tipica implementazione è la seguente

Cosa c’è che non va in questo codice? Naturalmente è semplice e leggibile, tuttavia questo approccio non rende chiare le condizioni in cui la funzione non può completare con successo il proprio compito.

Vediamo come sostituire il costrutto if con guard.

Questa nuova versione offre 2 vantaggi:

  1. leggendo il codice adesso è molto più chiaro che numberA e numberB devono essere convertibili in Int, altrimenti il flusso termina e viene restituito nil
  2. non c’è bisogno di creare delle indentazioni ulteriori del codice.
  3. è chiaro che in alto abbiamo le clausole che terminano il flusso della funzione mentre in fondo abbiamo il risultato.

Terminare il flusso

Dopo l’istruzione else abbiamo vari modi per termine il flusso attuale

return nil: questo è possibile se la funzione attuale ha un optional come tipo di ritorno (come nel caso dell’esempio precedente).

return: nel caso la funzione ha void come tipo di ritorno. Ecco un esempio

fatalError(): in questo caso generiamo un errore che terminerà completamente l’esecuzione dell’app (esiste anche una variante di fatalError a cui possiamo passare il messaggio di errore).

break: se stai ancora usando i cicli FOR puoi interrompere l’esecuzione dell’intero for in questo modo

continue: oppure puoi saltare l’iterazione corrente del ciclo for e passare alla successiva

Ricorda, il compilatore ti obbliga a inserire dopo else un’istruzione che termini il flusso. Questo perché deve garantire che se il codice continua ad essere eseguito allora vuol dire che la condizione del guard è stata soddisfatta.

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *