Funzioni higher-order personalizzate
Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 42 di 56.
Ora puoi scrivere le tue funzioni di ordine superiore e si integreranno perfettamente con map e filter. La struttura è sempre la stessa: accetta un parametro closure, chiamalo all'interno del ciclo e restituisci il risultato.
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for item in self {
result.append(transform(item))
}
return result
}
}
[1, 2, 3].myMap { $0 * 10 } // [10, 20, 30]Se le estensioni ti sembrano complicate, scrivi invece una funzione libera: l’idea è la stessa:
func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
var n = 0
for item in items where predicate(item) {
n += 1
}
return n
}Una volta che riesci a passare in giro le closure, la libreria standard smette di sembrare magica e inizia a sembrare un insieme di schemi che potresti scrivere da solo.
Sfida
MedioScrivi una funzione libera partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]) che percorra l'array una sola volta e restituisca una tupla (matched, rest): gli elementi che soddisfano il predicato e gli altri, entrambi nell'ordine originale.
Leggi due righe: un intero min, poi un elenco di interi separati da virgole. Usa la tua partition con un predicato che verifica n > min. Stampa:
matched: <...>rest: <...>
Ogni elenco deve essere unito con , (oppure essere vuoto se non c'è nulla da stampare).
Per l'input 5 / 2,7,3,8,5, l'output è:
matched: 7,8
rest: 2,3,5Provalo tu
let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: partition(_:by:) -> ([Int], [Int]); stampa gli elementi corrispondenti e i rimanenti
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 parole8Chiusure
Nozioni di base sulle closureClosure finaliCatturare i valoriRestituire closureFunzioni higher-order personalizzateRiepilogo - Costruttore di pipelineEsercitati da solo: Playground Swift