UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Closures

Vous avez déjà rencontré des nombres entiers, des chaînes de caractères, des nombres décimaux (floats et doubles), des booléens, des tableaux, des dictionnaires, des structures et des classes, mais il existe un autre type de données très utilisé en Swift, appelé closure. Ce type est compliqué, mais il est si puissant et expressif que son utilisation est très répandue dans Cocoa Touch. Vous n’irez donc pas très loin sans le comprendre.

Une closure peut être considérée comme une variable contenant du code. Ainsi, alors qu'un entier contient une valeur (0 ou 500 par exemple), une closure contient des lignes de code en Swift. Elle diffère toutefois d'une fonction, car elle est un type de données à part entière : vous pouvez passer une closure en tant que paramètre ou la stocker en tant que propriété. Les closures capturent également l'environnement dans lequel elles ont été créées, ce qui signifie qu'elles prennent une copie des valeurs qui sont utilisées à l'intérieur d'elles.

Vous n'aurez jamais besoin de concevoir vos propres closures, alors n'ayez aucune crainte si vous trouvez ce qui suit plutôt compliqué. Cependant, Cocoa et Cocoa Touch vous demanderont souvent d'écrire des closures pour répondre à leurs besoins, vous devez donc au moins savoir comment elles fonctionnent. Prenons d'abord un exemple en Cocoa Touch :

let vw = UIView()

UIView.animate(withDuration: 0.5, animations: {
    vw.alpha = 0
})

UIView est un type de données iOS dans UIKit qui représente le conteneur d'interface utilisateur le plus élémentaire. Ne vous inquiétez pas de ce qu'il fait pour l'instant, tout ce qui compte c'est que ce soit le composant d'interface utilisateur de base. UIView a une méthode appelée animate() et elle vous permet de changer l'apparence de votre interface à l'aide d'une animation - vous décrivez ce qui change et en combien de secondes, Cocoa Touch fait le reste.

La méthode animate() prend deux paramètres dans ce code : le nombre de secondes que doit durer l'animation, et une closure contenant le code à exécuter dans le cadre de l'animation. J'ai spécifié une demi-seconde en tant que premier paramètre et, pour le second, j'ai demandé à UIKit de régler l'alpha de la vue (c'est son opacité) sur 0, ce qui signifie "complètement transparente".

Cette méthode a besoin d'utiliser une closure car UIKit doit effectuer toutes sortes d'opérations pour que l'animation puisse débuter. UIKit prend une copie du code à l'intérieur des accolades (c'est notre closure), la stocke, effectue tout son travail de préparation, puis exécute notre code quand il est prêt. Cela ne serait pas possible si nous exécutions notre code directement.

Le code ci-dessus montre également comment les closures capturent leur environnement : j'ai déclaré la constante vw en dehors de la closure, puis je l'ai utilisée à l'intérieur. Swift détecte cela et rend ces données disponibles également à l'intérieur de la closure.

Le système de capture automatique de l'environnement d'une closure en Swift est très utile, mais peut occasionnellement vous induire en erreur : si l'objet A stocke une closure en tant que propriété, et que cette propriété fait également référence à l'objet A, vous avez ce qu'on appelle un cycle de référence fort et vous utilisateurs seront mécontents. Il s'agit d'un sujet nettement plus avancé que ce que vous devez savoir pour le moment, alors ne vous inquiétez pas trop à ce sujet pour l'instant.

Closures finales

Comme les closures sont utilisées tellement souvent, Swift peut améliorer leur syntaxe pour faciliter la lecture de votre code. La règle est la suivante : si le dernier paramètre d'une méthode prend une closure, vous pouvez éliminer ce paramètre et le remplacer par un bloc de code entre accolades. Par exemple, nous pourrions convertir le code précédent comme ceci :

let vw = UIView()

UIView.animate(withDuration: 0.5) {
    vw.alpha = 0
}

Cela rend votre code plus court et plus facile à lire, c'est pourquoi cette forme de syntaxe - connue sous le nom de fermeture finale (trailing closure) - est préférée.

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.