Menu
Coddy logo textTech

Retourner des closures

Fait partie de la section Logique et Flux du Journey Swift de Coddy. Leçon 41 sur 56.

Vous avez vu makeCounter retourner une closure. La même astuce vous permet de construire un comportement configurable : prenez des paramètres une fois, et obtenez en retour une fonction qui les utilise plusieurs fois.

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4))                  // 12
print(tenfold(4))                 // 40

La closure retournée capture k, donc chaque appel à multiplier(...) produit une toute nouvelle closure avec son propre k.

Ce patron est au cœur du code de « stratégie » en Swift : écrivez une fonction qui prend une configuration et renvoie une closure, puis passez la closure à map, filter, sorted(by:), ou partout ailleurs où une valeur de type fonction est attendue.

challenge icon

Défi

Moyen

Construisez deux fabriques de fermetures (closure factories) :

  • greaterThan(_ k: Int) -> (Int) -> Bool : renvoie un prédicat qui est true lorsque son argument est strictement supérieur à k
  • scaleBy(_ k: Int) -> (Int) -> Int : renvoie une fonction qui multiplie son argument par k

Lisez trois lignes :

  1. Un entier threshold
  2. Un entier scale
  3. Une liste d'entiers séparés par des virgules, les nums

Affichez trois lignes :

  1. Les nombres supérieurs au seuil (filtrez avec la fermeture de greaterThan), joints par ,
  2. Ces mêmes nombres, mis à l'échelle (mappez avec scaleBy), joints par ,
  3. Le nombre d'éléments qui ont été conservés

Pour l'entrée 5 / 3 / 2,7,3,8,9, la sortie est :

7,8,9
21,24,27
3

Essayez vous-même

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

// TODO: greaterThan, scaleBy; filtrer puis mapper; afficher les éléments joints et le compte
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

Entraînez-vous par vous-même : Playground Swift