Nous effectuons beaucoup de travail asynchrone sur les appareils mobiles dans le but d’empêcher notre code de bloquer le thread principal. Auparavant, cela signifiait beaucoup de méthodes de délégation, mais les avancées plus récentes en Objective-C nous ont permis de renvoyer des valeurs aux blocs en tant que gestionnaires de complétion. Sans aucun doute, nous devrons également en faire beaucoup dans swift.

Voici une définition de fonction de Objective-C qui utilise le modèle de bloc de complétion et la syntaxe associée pour l’utiliser:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

Merci Putain de Syntaxe de bloc! Je ne me souviens jamais non plus de ce genre de choses

Swift a l’occasion d’améliorer cela car il ne doit pas être un ajout de langage après coup, il peut être intégré dès le début.

Le résultat peut sembler complexe (comme le font toutes les déclarations de fonctions dans les fonctions) mais est vraiment simple. C’est juste une définition de fonction qui prend une fonction comme argument, donc tant que vous comprenez que l’imbrication devrait rapidement devenir claire:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

La fermeture d’achèvement ici n’est qu’une fonction qui prend une chaîne et renvoie void. Au début, cela sonne à l’envers – cela prend une chaîne comme argument? Nous voulons retourner une ficelle! – mais nous ne voulons pas vraiment retourner une chaîne, cela signifierait que nous avons bloqué jusqu’à notre retour. Au lieu de cela, nous appelons une fonction que l’appelé nous a donnée et leur fournissons les arguments associés.

Utiliser des gestionnaires de complétion est plus facile que de les déclarer, grâce à un moyen intelligent de raccourcir les appels de fonction de l’équipe swift:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

C’est une fermeture de fin, quelque chose que nous pouvons utiliser chaque fois que le dernier argument est une fermeture. En utilisant la syntaxe {() in } quelque peu étrange, nous avons comme par magie les résultats que nous avons transmis la fermeture dans notre fonction asynchrone. Je n’ai vraiment pas encore sondé les profondeurs de swift pour comprendre ce qui fait vibrer cette syntaxe, mais pour l’instant je suis heureux que cela fonctionne.

Laisser un commentaire

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