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.
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)
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.
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.
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 Continua
dichiarazione 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 ...
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.
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
.
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.