Menu
Coddy logo textTech

Les bases des closures

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 38 sur 56.

Une closure est un bloc de code autonome que vous pouvez transmettre et appeler plus tard. La syntaxe complète précise les types de paramètres et de retour :

let double = { (n: Int) -> Int in
    return n * 2
}
print(double(5))                  // 10

Swift peut inférer les types lorsque le contexte est clair, vous écrirez donc rarement la forme longue. À l'intérieur de map, filter, etc., la syntaxe raccourcie est la norme :

let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 }    // le plus court, $0 est le premier argument

Les closures sont des valeurs, vous pouvez les stocker dans des variables, les retourner depuis des fonctions et les passer en tant qu'arguments. C'est la raison même pour laquelle map fonctionne.

challenge icon

Défi

Facile

Lisez deux lignes d'entrée :

  1. Un entier x
  2. Une liste d'entiers séparés par des virgules

Définissez trois fermetures (closures), chacune de type (Int) -> Int :

  • addX ajoute x à son argument
  • square retourne l'argument au carré
  • negate retourne l'argument opposé (négatif)

Appliquez chaque fermeture à chaque élément de la liste en utilisant map. Affichez trois lignes, une par fermeture, avec les résultats joints par , :

addX: ...
square: ...
negate: ...

Pour l'entrée 10 sur la ligne 1 et 1,2,3 sur la ligne 2, la sortie est :

addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3

Aide-mémoire

Une closure est un bloc de code autonome qui peut être stocké et transmis. Syntaxe complète :

let double = { (n: Int) -> Int in
    return n * 2
}

Les closures peuvent être stockées dans des variables et transmises comme arguments (par exemple à map). Swift infère les types selon le contexte, permettant une syntaxe raccourcie :

let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 }  // $0 est le premier argument

Essayez vous-même

let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: définir trois closures (Int) -> Int et mapper nums à travers chacune
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux