Swift 2 Quitter tôt avec garde

Est-ce que cela vous surprend que je dédie un tutoriel à un simple ajout en tant que garde déclaration? J'espère que vous comprendrez mieux mon enthousiasme à la fin de ce tutoriel. Au cours de ce tutoriel, j'espère vous convaincre que garde est tout sauf un ajout redondant au langage de programmation Swift.

Minimiser la complexité

Les conditions sont un composant fondamental de chaque langage de programmation. Objective-C et Swift ne font pas exception à la règle. Si vous envisagez d'écrire une application de toute complexité, les conditionnelles se croiseront sur votre chemin, rien ne leur échappera..

Malheureusement, les conditionnels sont souvent la cause même de la complexité. Les conditionnels imbriqués en particulier peuvent conduire à des bogues difficiles à trouver, à un code difficile à comprendre et à des cas marginaux facilement négligés.

Pour garder imbriqué si instructions au minimum, j’utilise fréquemment le modèle suivant dans Objective-C.

- (void) fetchListOfCustomers: (NSArray *) clients if (! self.reachable) return; if (! self.connected) return; si (! clients ||! [nombre de clients]) revient;… 

L'idée est de renflouer dès que possible. le si les instructions de l'exemple représentent un ensemble d'exigences devant être satisfaites avant l'exécution du reste du corps de la méthode.

L'exemple ci-dessus se traduit par l'équivalent légèrement plus complexe suivant.

- (void) fetchListOfCustomers: (NSArray *) clients if (self.reachable && self.connected) if (clients && [nombre de clients]) … 

Voyez-vous le problème se cacher dans cet exemple? Nous sommes déjà imbriqués sur deux niveaux sans avoir rien fait d'intéressant.

Il est facile de traduire le modèle ci-dessus en Swift. La syntaxe semble similaire, mais en raison de les clients étant une option, nous devons déballer le les clients argument avant que nous puissions accéder à sa valeur.

func fetchListOfCustomers (clients: [client]?) si! accessible retour si! connecté retour si laissez clients = clients où clients.compte> 0 imprimer (clients) 

Sortir tôt

Swift 2 introduit le garde déclaration. Il a été conçu spécifiquement pour quitter une méthode ou une fonction tôt. le garde statement est idéal pour se débarrasser des conditionnelles profondément imbriquées dont le seul but est de valider un ensemble d'exigences. Jetez un coup d’œil à l’exemple mis à jour dans lequel j’ai remplacé tous les si déclaration avec le nouveau garde déclaration.

func fetchListOfCustomers (clients: [client]?) garde accessible autre retour garde connectée autre retour garde laisser clients = clients où clients.compte> 0 autre retour imprimer (clients) 

Il y a plusieurs choses à noter. Commençons par la syntaxe.

Syntaxe

le garde mot-clé souligne que nous validons une exigence. Nous sommes garde contre quelque chose. Dans l'exemple, nous vérifions explicitement si accessible et connecté sont vrai. S'ils ne le sont pas, nous quittons la méthode tôt. Le fait est que la syntaxe est plus explicite sur les exigences qu’un système classique. si déclaration.

Sortie

Notez que garde déclaration a toujours un autre clause. le autre clause est exécutée si la condition de la garde déclaration évalue à faux. En utilisant garde est beaucoup plus logique lorsque vous validez des exigences.

dans le autre clause, vous devez transférer le contrôle hors du champ dans lequel garde déclaration apparaît. Nous utilisons un revenir déclaration dans l'exemple ci-dessus, mais vous pouvez, par exemple, utiliser un continuerdéclaration si vous êtes dans une boucle ou jetez une erreur. Jetez un coup d’œil à l’exemple actualisé ci-dessous dans lequel nous jetons une erreur dans autre clause. Noter la jette mot-clé dans la déclaration de méthode pour indiquer que fetchListOfCustomers (_ :) est une méthode de projection.

func fetchListOfCustomers (clients: [client]?) jette garde accessible autre lance APIError.APIErrorUnreachable garde connectée else lance APIError.APIErrorNotConnected garde laissa clients = clients où clients.count> 0 autre lance APIError.APIErrorNoCustomers…] 

Puissant

UNE garde déclaration est tout aussi puissant qu'un si déclaration. Vous pouvez utiliser des liaisons facultatives et même utiliser Les clauses, introduites dans Swift 1.2, sont autorisées. Je suis sûr que vous reconnaissez que l'exemple est facile à comprendre, ce qui élimine les conditionnelles imbriquées inutiles..

Portée

Une différence importante avec si instructions est l'étendue des variables et constantes auxquelles sont attribuées des valeurs à l'aide d'une liaison facultative. Dans l'exemple ci-dessus, le les clients une valeur a été affectée à la constante à l'aide d'une liaison facultative. le les clients constante est accessible de la portée du garde déclaration apparaît. Il s’agit d’un détail important et de l’un des principaux avantages de l’utilisation de garde.

Conclusion

Si tu pensais ça garde était une simple variation de Swift si déclaration, alors j'espère vous avoir convaincu du contraire. Tandis que si les déclarations continueront d'être votre outil de choix dans la plupart des situations, garde présente de nombreux avantages dans certaines situations. Cela est particulièrement vrai si elle est utilisée en combinaison avec la gestion des erreurs, également introduite dans Swift 2..