Menu
Coddy logo textTech

Restituire closure

Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 41 di 56.

Hai visto makeCounter restituire una closure. Lo stesso trucco ti permette di creare un comportamento configurabile: passi i parametri una volta e ottieni una funzione che li usa molte volte.

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 restituita cattura k, quindi ogni chiamata a multiplier(...) produce una nuova closure con il proprio k.

Questo schema è il nucleo del codice basato sulle «strategie» in Swift: scrivi una funzione che accetta una configurazione e restituisce una closure, poi passa la closure a map, filter, sorted(by:) o ovunque sia previsto un valore sotto forma di funzione.

challenge icon

Sfida

Medio

Crea due factory di closure:

  • greaterThan(_ k: Int) -> (Int) -> Bool: restituisce un predicato che è true quando il suo argomento è strettamente maggiore di k
  • scaleBy(_ k: Int) -> (Int) -> Int: restituisce una funzione che moltiplica il suo argomento per k

Leggi tre righe:

  1. Un intero threshold
  2. Un intero scale
  3. Un elenco di interi separati da virgole, nums

Stampa tre righe:

  1. I numeri maggiori della soglia (filtra con la closure di greaterThan), uniti con ,
  2. Gli stessi numeri, moltiplicati per il fattore di scala (mappa con scaleBy), uniti con ,
  3. Quanti sono passati

Per l'input 5 / 3 / 2,7,3,8,9, l'output è:

7,8,9
21,24,27
3

Provalo tu

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

// TODO: greaterThan, scaleBy; prima filter, poi map; stampa i valori uniti e il conteggio
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Swift