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)) // 40La 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.
Sfida
MedioCrea due factory di closure:
greaterThan(_ k: Int) -> (Int) -> Bool: restituisce un predicato che ètruequando il suo argomento è strettamente maggiore dikscaleBy(_ k: Int) -> (Int) -> Int: restituisce una funzione che moltiplica il suo argomento perk
Leggi tre righe:
- Un intero
threshold - Un intero
scale - Un elenco di interi separati da virgole,
nums
Stampa tre righe:
- I numeri maggiori della soglia (filtra con la closure di
greaterThan), uniti con, - Gli stessi numeri, moltiplicati per il fattore di scala (mappa con
scaleBy), uniti con, - Quanti sono passati
Per l'input 5 / 3 / 2,7,3,8,9, l'output è:
7,8,9
21,24,27
3Provalo 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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle paroleEsercitati da solo: Playground Swift