Écriture de blocs d’achèvement avec des fermetures dans Swift

Même après avoir bien maîtrisé le concept de blocs, j’ai quand même dû rechercher leur syntaxe chaque fois que je voulais écrire autre chose que le plus simple des blocs (merci fuckingblocksyntax.com ). La version des blocs de Swift, connue sous le nom de fermetures, adopte une approche beaucoup plus propre et naturelle de la syntaxe. Alors sans plus tarder, il est temps d’apprendre les fermetures comme mon père m’a appris: en écrivant un bloc d’achèvement.

L’API d’animation d’UIView est l’une des zones les plus utilisées par les développeurs iOS. Avant d’écrire aveuglément votre propre méthode, essayez d’utiliser l’un des exemples de code d’Apple pour vous familiariser avec la syntaxe. Voici un exemple Objective-C, puis le même code écrit en Swift:

Objective C:

Swift:

Au grand dam des lapins et des développeurs myopes, les carets (^) sont introuvables (encore) dans Swift. Repose en paix vieil ami, tu as été remplacé par le mot clé in. Vous utilisez le mot clé in une fois que vous avez fini de déclarer les paramètres et les valeurs de retour pour votre fermeture. Cela aura plus de sens si je vous montre ce que la saisie semi-automatique a rempli une fois qu’il a su quelle méthode je voulais:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

En se concentrant sur cette syntaxe, il devient clair comment écrire correctement les paramètres et les valeurs de retour d’une fermeture:

{(parameters) -> (return type) in expression statements}

Dans l’exemple de code Swift ci-dessus, les deux fermetures d’animation ont renvoyé void, nous avons donc pu supprimer la syntaxe du type de retour ensemble. C’est pourquoi vous ne voyez que le () pour les paramètres. Notez que même s’il n’y a pas de paramètres, comme dans la première fermeture, vous avez toujours besoin de ceux de empty() avant le mot clé in. Ils sont requis. En gras pour que vous vous en souveniez.

D’accord, essayons maintenant d’écrire notre propre méthode Swift avec une fermeture d’achèvement. Dans le référentiel Github lié au bas de cet article, j’ai travaillé sur une application cliente Github dans Swift avec une équipe de Code Fellows. Dans ce projet, nous avons un contrôleur réseau qui gère tous les appels réseau asynchrones vers l’API de Github.

Écrivons une méthode qui récupère une liste d’utilisateurs à partir d’une requête de recherche sur le client. Cette méthode nécessitera une fermeture d’achèvement pour informer le contrôleur de vue demandeur lorsque l’appel réseau est terminé et fournir un tableau de modèles utilisateur pour remplir notre vue de collection.

Voici à quoi ressemblerait la signature de la fonction:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

Nous avons deux paramètres ici: un type de chaîne appelé searchTerm et notre fermeture d’achèvement. Remarquez la syntaxe dans le paramètre de fermeture? Le premier est le nom de notre fermeture, c’est ainsi que nous l’appellerons plus tard dans la méthode, puis le paramètre (tableau d’utilisateurs), suivi de notre valeur de retour (void). Voici une approximation de ce à quoi ressemble le corps de cette méthode:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

Appeler notre fermeture d’achèvement dans Swift est presque de la même manière que nous appelons notre bloc d’achèvement dans Objective-C. Il est appelé comme toute autre fonction, et nous nous assurons de passer un tableau en paramètre, car c’est ainsi que nous l’avons défini dans notre signature de fonction. J’ai volontairement omis tout le code de mise en réseau pour garder ce post aussi court que possible, mais n’hésitez pas à consulter le référentiel Github si vous souhaitez voir comment cela fonctionne. Nous prévoyons d’avoir un article de blog sur le réseau dans Swift dans un proche avenir.

Enfin, regardons comment nous appellerions cette méthode à partir de notre SearchUsersViewController:

Une autre chose que je veux que vous remarquiez est la façon dont j’ai appelé addOperationWithBlock() sur notre mainQueue(). Si une fermeture est le dernier paramètre de la signature d’une fonction, vous pouvez utiliser une syntaxe spéciale pour la rendre encore plus propre. C’est ce qu’on appelle une fermeture de fin. Les fermetures de fin sont écrites directement après les () d’un appel de fonction. Vous trouverez ci-dessous un appel de fonction, d’abord avec une fermeture régulière, puis avec une fermeture finale.

C’est une différence subtile, et les deux façons fonctionnent. Rappelez-vous simplement que ce doit être le dernier paramètre de la fonction pour utiliser la syntaxe de fermeture de fin.

Maintenant, vous devez connaître la syntaxe de base des fermetures dans Swift. Pour des trucs de niveau plus avancé sur les fermetures, consultez le langage de programmation Swift sur iBooks. Il a une sous-section entière sur eux. Et voici le lien vers le projet client github.

Il existe également déjà une contrepartie Swift à fuckingblocksyntax.com appelé, tu l’as deviné, baisant des closuresyntax.com cela vaut vraiment la peine d’ajouter à votre barre de signets lorsque vous apprenez Swift.

Bonne journée.

Prêt à devenir développeur professionnel ? Contactez-nous découvrez comment!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.