Swift-Fermetures
Les fermetures dans Swift 4 sont similaires à celles des fonctions autonomes organisées en blocs et appelées n’importe où comme les langages C et Objective C. Les constantes et les références de variables définies à l’intérieur des fonctions sont capturées et stockées dans des fermetures. Les fonctions sont considérées comme des cas particuliers de fermetures et prennent les trois formes suivantes −
Fonctions globales | Fonctions imbriquées | Expressions de fermeture |
---|---|---|
Avoir un nom. Ne capturez aucune valeur | Ayant un nom. Capturez les valeurs de la fonction englobante | Les fermetures sans nom capturent les valeurs des blocs adjacents |
Les expressions de fermeture en langage Swift 4 suivent des styles de syntaxe nets, optimisés et légers, notamment.
- Déduire les types de paramètres et de valeurs de retour à partir du contexte.
- Retours implicites de fermetures à expression unique.
- Noms d’arguments abrégés et
- Syntaxe de fermeture de fin
Syntaxe
Voici une syntaxe générique pour définir la fermeture qui accepte les paramètres et renvoie un type de données −
{ (parameters) −> return type in statements}
Voici un exemple simple −
let studname = { print("Welcome to Swift Closures") }studname()
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
Welcome to Swift Closures
La fermeture suivante accepte deux paramètres et renvoie une valeur Bool −
{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}
Voici un exemple simple −
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
Lorsque nous exécutons le programme ci-dessus en utilisant playground, nous obtenons le résultat suivant −
10
Les expressions dans les fonctions imbriquées Closures
fournissent un moyen pratique de nommer et de définir des blocs de code. Au lieu de représenter toute la déclaration de fonction et les constructions de nom sont utilisées pour désigner des fonctions plus courtes. La représentation de la fonction dans une brève déclaration claire avec une syntaxe ciblée est obtenue grâce à des expressions de fermeture.
Programme d’ordre croissant
Le tri d’une chaîne est réalisé par la fonction réservée à la touche Swift 4s « trié » qui est déjà disponible dans la bibliothèque standard. La fonction trie les chaînes données dans l’ordre croissant et renvoie les éléments dans un nouveau tableau avec la même taille et le même type de données mentionnés dans l’ancien tableau. L’ancien tableau reste le même.
Deux arguments sont représentés dans la fonction triée −
-
Valeurs de type connu représentées sous forme de tableaux.
-
Contenu du tableau (Int, Int) et renvoie une valeur booléenne (Bool) si le tableau est trié correctement, il retournera la valeur true sinon il retournera false.
Une fonction normale avec une chaîne d’entrée est écrite et transmise à la fonction triée pour obtenir le tri des chaînes dans un nouveau tableau, qui est illustré ci-dessous −
func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)
Lorsque nous exécutons le programme ci-dessus en utilisant playground, nous obtenons le résultat suivant −
true
Le tableau initial à trier pour icecream est donné comme « Swift 4 » et « great ». La fonction de tri du tableau est déclarée comme type de données string et son type de retour est mentionné comme booléen. Les deux chaînes sont comparées et triées par ordre croissant et stockées dans un nouveau tableau. Si le tri est effectué avec succès, la fonction retournera une valeur true sinon elle retournera false.
Syntaxe d’expression de fermeture utilise −
- paramètres constants,
- paramètres variables et
- paramètres inout.
L’expression de fermeture ne prenait pas en charge les valeurs par défaut. Les paramètres variadiques et les Tuples peuvent également être utilisés comme types de paramètres et types de retour.
let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
30
Les déclarations de paramètres et de type de retour mentionnées dans l’instruction de fonction peuvent également être représentées par la fonction d’expression de fermeture en ligne avec le mot clé ‘in’. Une fois le paramètre déclaré et les types de retour, le mot clé ‘in’ est utilisé pour indiquer que le corps de la fermeture.
L’expression unique Renvoie implicitement
Ici, le type de fonction du deuxième argument de la fonction triée indique clairement qu’une valeur Bool doit être renvoyée par la fermeture. Étant donné que le corps de la fermeture contient une seule expression (s1 > s2) qui renvoie une valeur Bool, il n’y a aucune ambiguïté et le mot clé return peut être omis.
Pour renvoyer une seule instruction d’expression dans les fermetures d’expression, le mot clé ‘return’ est omis dans sa partie déclaration.
var count: = let descending = count.sorted(by: { n1, n2 in n1 > n2 })let ascending = count.sorted(by: { n1, n2 in n1 < n2 })print(descending)print(ascending)
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
L’instruction elle-même définit clairement que lorsque la chaîne 1 est supérieure à la chaîne 2, return true sinon false, l’instruction return est donc omise ici.
Fermetures de type connu
Considérons l’ajout de deux nombres. Nous savons que l’addition retournera le type de données entier. Par conséquent, les fermetures de type connues sont déclarées comme −
let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
-10
Déclarer des noms d’arguments abrégés en tant que Closures
Swift 4 fournit automatiquement des noms d’arguments abrégés aux fermetures en ligne, qui peuvent être utilisés pour faire référence aux valeurs des arguments de la fermeture par les noms00,11,22, etc.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
Ici, $0 et $1 font référence aux premier et deuxième arguments de chaîne de la fermeture.
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
200
Swift 4 permet à l’utilisateur de représenter les fermetures en ligne sous forme de noms d’arguments abrégés en représentant $0, $1, $2 — $ n.
La liste d’arguments Closures est omise dans la section définition lorsque nous représentons des noms d’arguments abrégés dans des expressions de fermeture. En fonction du type de fonction, les noms d’arguments abrégés seront dérivés. Comme l’argument raccourci est défini dans le corps de l’expression, le mot clé « in » est omis.
Fermetures en tant que fonctions d’opérateur
Swift 4 fournit un moyen facile d’accéder aux membres en fournissant simplement des fonctions d’opérateur en tant que fermetures. Dans les exemples précédents, le mot clé ‘Bool’ est utilisé pour renvoyer ‘true’ lorsque les chaînes sont égales sinon il renvoie ‘false’.
L’expression est rendue encore plus simple par la fonction opérateur en fermeture comme −
let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
Les fermetures en tant que remorques
Le passage de l’argument final de la fonction à une expression de fermeture est déclaré à l’aide de « Fermetures de fin ». Il est écrit en dehors de la fonction () avec {}. Son utilisation est nécessaire lorsqu’il n’est pas possible d’écrire la fonction en ligne sur une seule ligne.
reversed = sorted(names) { > }
où {$0 >11} sont représentés comme des fermetures de fin déclarées à l’extérieur (noms).
import Foundationvar letters = let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString})let stletters = letters.map() { .substringToIndex(advance(.startIndex, 2)).uppercaseString }print(stletters)
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
Capture des valeurs et des types de référence
Dans Swift 4, la capture des valeurs de constantes et de variables se fait à l’aide de fermetures. Il renvoie et modifie en outre les valeurs de ces constantes et variables à l’intérieur du corps de fermeture même si les variables n’existent plus.
La capture de valeurs constantes et variables est obtenue en utilisant une fonction imbriquée en écrivant une fonction avec dans le corps d’une autre fonction.
Une fonction imbriquée capture −
- Arguments de fonction externes.
- Capturez les constantes et les variables définies dans la fonction externe.
Dans Swift 4, lorsqu’une constante ou une variable est déclarée à l’intérieur d’une fonction, des références à ces variables sont également créées automatiquement par la fermeture. Il permet également de renvoyer plus de deux variables à la même fermeture comme suit −
let decrem = calcDecrement(forDecrement: 18)decrem()
Ici, les variables oneDecrement et Decrement pointeront toutes les deux le même bloc de mémoire que la référence de fermeture.
func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total print(overallDecrement) return overallDecrement } return decrementer}let decrem = calcDecrement(forDecrement: 18)decrem()decrem()decrem()
Lorsque nous exécutons le programme ci-dessus à l’aide de playground, nous obtenons le résultat suivant −
826446
Lorsque chaque fois que la fonction externe calcDecrement est appelée, elle appelle la fonction decrementer() et décrémente la valeur de 18 et renvoie le résultat à l’aide de la fonction externe calcDecrement. Ici, le calcDécrement agit comme une fermeture.
Même si la fonction decrementer() n’a pas d’arguments, la fermeture par défaut fait référence aux variables ‘overallDecrement’ et ‘total’ en capturant ses valeurs existantes. La copie des valeurs des variables spécifiées est stockée avec la nouvelle fonction decrementer(). Swift 4 gère les fonctions de gestion de la mémoire en allouant et en désallouant des espaces mémoire lorsque les variables ne sont pas utilisées.