swift

La prima cosa che balza all'occhio leggendo la definizione del manuale sulla dichiarazione guard è la sua somiglianza con if. Viene descritta in poche righe sotto il titolo "Early Exit" (uscita anticipata). Nella sua descrizione viene detto che il codice che segue la dichiarazione guard viene eseguito solo se la condizione dichiarata è vera, altrimenti viene eseguito il blocco else che a differenza della dichiarazione if è obbligatorio.

La domanda che viene spontanea è: qual'è la vera differenza rispetto ad if, perché ho bisogno di guard? La risposta non la si trova nella descrizione del paragrafo del manuale ma nel titolo: Early Exit.

L'utilità di uscire anticipatamente da una procedura è percepita nell'optional binding. Questa sintassi si usa per verificare se una variabile opzionale esiste al fine di effettuare delle operazioni su di essa. Supponiamo di avere un dispositivo seriale dal quale stiamo ricevendo delle stringhe di testo. Le stringhe vengono riposte in una apposita variabile che deve essere opzionale in quanto al termine della procedura non è detto che sia stata ricevuta una stringa, perché, ad esempio, il dispositivo nel frattempo potrebbe essere stato scollegato. Questa situazione la rappresento nel codice di seguito:

enum ElencoErrori: Error {

    case noError

    case erroreRicezione

    case erroreTrasmissione

}

 

var rs232: String?

rs232 = "stringa da dispositivo esterno"

 

if let seriale = rs232 {

    print("elaboro \(seriale)")

} else {

    throw ElencoErrori.erroreRicezione

}

 

guard rs232 != nil else {

    throw ElencoErrori.erroreRicezione

}

print("elaboro \(rs232)")

 

L'enumerazione degli errori e il comando throw vengono trattati negli appunti relativi alle gestione degli errori in swift. Nel caso specifico la variabile opzionale rs232 è la stringa che riceviamo dal dispositivo esterno che nell'esempio inizializzo a mano. Il codice che segue è l'esempio della generazione di un errore di ricezione usando prima l'istruzione if poi guard, con un solo caso di errore, come nell'esempio, si potrebbe trovare guard non particolarmente efficace rispetto ad if, ma si supponga di dover controllare una serie di possibili allarmi ed agire soltanto se tutti gli allarmi verificati danno esito negativo; in questo caso il codice risulterebbe molto più snello, leggibile e veloce nell'esecuzione, infatti alla prima condizione verificata con guard e non soddisfatta, il programma si interromperebbe generando un errore.