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.
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)
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.
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.
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 continuer
dé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…]
UNE garde
déclaration est tout aussi puissant qu'un si
déclaration. Vous pouvez utiliser des liaisons facultatives et même utiliser où
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..
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
.
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..