NEW: Join my free 100 Days of SwiftUI challenge today! >>

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.

LEARN SWIFTUI FOR FREE I have a massive, free SwiftUI video collection on YouTube teaching you how to build complete apps with SwiftUI – check it out!

MASTER SWIFT NOW
Buy Testing Swift Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift 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!