Swift 2 Esci presto con la guardia

Ti sorprende che sto dedicando un tutorial a una semplice aggiunta come guardia affermazione? Spero tu possa capire meglio la mia eccitazione alla fine di questo tutorial. Durante questo tutorial, spero di convincerti guardia è tutto fuorché un'aggiunta ridondante al linguaggio di programmazione Swift.

Minimizzare la complessità

I condizionali sono una componente fondamentale di ogni linguaggio di programmazione. Objective-C e Swift non fanno eccezione a questa regola. Se hai intenzione di scrivere un'applicazione di qualsiasi complessità, i condizionali attraverseranno il tuo percorso, non c'è modo di sfuggirli.

Sfortunatamente, i condizionali sono spesso la causa della complessità. I condizionali nidificati, in particolare, possono portare a bug difficili da trovare, codice difficile da capire e casi limite facilmente trascurati.

Per rimanere nidificati Se dichiarazioni al minimo, io frequentemente uso il seguente modello in Objective-C.

- (void) fetchListOfCustomers: (NSArray *) customers if (! self.reachable) return; se return (! self.connected); se (! clienti ||! [clienti contano]) ritorno; ... 

L'idea è di uscire il prima possibile. Il Se le istruzioni nell'esempio rappresentano un insieme di requisiti che devono essere soddisfatti prima dell'esecuzione del resto del corpo del metodo.

L'esempio sopra riportato si traduce nel seguente equivalente leggermente più complesso.

- (void) fetchListOfCustomers: (NSArray *) customers if (self.reachable && self.connected) if (customers && [clienti conta]) ... 

Vedi il problema in agguato in questo esempio? Siamo già nidificati a due livelli in profondità senza aver fatto nulla di interessante.

È facile tradurre il pattern sopra in Swift. La sintassi sembra simile, ma a causa di clienti essendo un optional, abbiamo bisogno di scartare il clienti argomento prima di poter accedere al suo valore.

func fetchListOfCustomers (clienti: [Cliente]?) if! reach return if! connected return se lascia clienti = clienti dove customers.count> 0 print (clienti) 

Uscire presto

Swift 2 introduce il guardia dichiarazione. È stato progettato specificamente per uscire presto da un metodo o una funzione. Il guardia la dichiarazione è l'ideale per sbarazzarsi di condizionali profondamente nidificati il ​​cui unico scopo è quello di convalidare una serie di requisiti. Dai un'occhiata all'esempio aggiornato in cui li ho sostituiti tutti Se dichiarazione con il nuovo guardia dichiarazione.

func fetchListOfCustomers (clienti: [Cliente]?) guardia raggiungibile altro return guard connected else return guardia consente ai clienti = clienti dove customers.count> 0 else return print (clienti) 

Ci sono molte cose che vale la pena notare. Iniziamo con la sintassi.

Sintassi

Il guardia parola chiave sottolinea che stiamo convalidando un requisito. Noi siamo guardia contro qualcosa. Nell'esempio, controlliamo esplicitamente se raggiungibile e collegato siamo vero. Se non lo sono, usciremo presto dal metodo. Il punto è che la sintassi è più esplicita sui requisiti di una normale Se dichiarazione.

Uscita

Si noti che a guardia la dichiarazione ha sempre un altro clausola. Il altro la clausola viene eseguita se la condizione di guardia la dichiarazione valuta a falso. utilizzando guardia ha molto più senso quando si convalidano i requisiti.

Nel altro clausola, è necessario trasferire il controllo dall'ambito in cui il guardia appare la dichiarazione Noi usiamo a ritorno dichiarazione nell'esempio precedente, ma è possibile, ad esempio, utilizzare a Continuadichiarazione se sei in un ciclo o lanciare un errore. Dai un'occhiata all'esempio aggiornato di seguito in cui viene generato un errore nel file altro clausola. Notare la getta parola chiave nella dichiarazione del metodo per indicarlo fetchListOfCustomers (_ :) è un metodo di lancio.

func fetchListOfCustomers (clienti: [Cliente]?) getta guardia raggiungibile altro gira APIError.APIErrorUnreachable guardia connesso else gira APIError.APIErrorNotConnected guardia lascia clienti = clienti dove customers.count> 0 else lancia APIError.APIErrorNoCustomers ... 

Potente

UN guardia la dichiarazione è potente quanto un Se dichiarazione. È possibile utilizzare i collegamenti opzionali e persino l'uso di dove le clausole, introdotte in Swift 1.2, sono consentite. Sono sicuro che sei d'accordo sul fatto che l'esempio sia facile da capire, eliminando condizioni condizionali annidate non necessarie.

Scopo

Una differenza importante con Se le istruzioni sono l'ambito di variabili e costanti a cui sono assegnati valori utilizzando un'associazione facoltativa. Nell'esempio sopra, il clienti alla costante è stato assegnato un valore utilizzando un'associazione facoltativa. Il clienti costante è accessibile dal campo di applicazione guardia appare la frase. Questo è un dettaglio importante e uno dei principali vantaggi dell'uso guardia.

Conclusione

Se l'hai pensato guardia era una semplice variazione su Swift Se dichiarazione, quindi spero di averti convinto diversamente. Mentre Se le dichiarazioni continueranno a essere il tuo strumento di scelta nella maggior parte delle situazioni, guardia ha una serie di vantaggi in determinate situazioni. Questo è particolarmente vero se usato in combinazione con la gestione degli errori, che è stato introdotto anche in Swift 2.