Skip to main content

flatMap in Swift (Functional Programming)

3648 - Game Character IVIn questo articolo vedremo il metodo flatMap disponibile per la struct Array. Si tratta di uno degli strumenti che vi permetteranno di scrivere codice Functional Programming estremamente potente.

Prima di proseguire dovreste assicurarvi di aver compreso il concetto il metodo map e filter (quindi guardarvi gli articoli relativi se volete).

Avete ripassato? Ottimo allora possiamo andare avanti!

Da ora in poi annoteremo esplicitamente il tipo delle variabili in odo da rendere il codice più chiaro.

Il problema

Immaginiamo di avere una lista di stringhe che (dovrebbero) rappresentare degli interi, tipo la seguente.

Vogliamo trasformare words in un array di [Int].

Come fare?

Un ciclo FOR?

Il primo impulso potrebbe essere di scrivere il seguente codice.

Questo codice funziona correttamente.

Però siccome abbiamo letto questo articolo abbiamo intenzione di evitare il ciclo FOR e scrivere codice Functional Programming, quindi proviamo un’altra strada.

Il metodo map?

Abbiamo appena letto l’articolo su map quindi decidiamo di utilizzarlo. Scriviamo un codice di questo tipo.

Il problema è che Int($0) non ritorna un Int ma un Int? (insomma un Int opzionale). Infatti l’initializer di Int che riceve una String come parametro è di tipo failable perché non può garantire di poter essere sempre in grado di costruire un Int.

D’accordo possiamo dunque scrivere quanto segue

Adesso stiamo eseguendo il force unwrap di Int($0), quindi come risultato avremo un [Int].

Esatto. Ma cosa succederebbe se l’array words contenesse un valore non convertibile in Int?

Questo scenario provocherebbe un fatal error perché durante l’ultima iterazione verrebbe eseguito un force unwrap di un valore nil.

filter + map?

D’accordo, abbiamo di recente letto anche l’articolo sul filter, quindi potremmo scrivere il seguente codice

Adesso abbiamo ottenuto il risultato desiderato infatti stiamo convertendo un array di String in un array di Int e stiamo scartando i valori che non sono convertibili.

Inoltre il meccanismo è sicuro perché stiamo effettuando un force unwrap (riga #4) solo dopo esserci assicurati che il valore sia non nil (riga #3).

Tuttavia esiste un modo migliore per ottenere lo stesso risultato, basta usare flatMap

flatMap

Vediamo subito il codice.

Cosa sta succedendo? Il metodo flatMap riceve una closure che ritorna un valore Optional (chiamiamolo Element?).

Tutti i valori nil vengono automaticamente scartati dal flatMap che quindi è in grado di ritornare un array fatto in questo modo [Element]  (senza valori Optional).

Conclusione

flatMap è utile in tutti quei casi in cui volete scartare i valori nil e volete che il risultato sia un array di elementi NON optional.

Se avete dubbi o domende scrivete usando i commenti qui sotto.

Trainer • Developer • Writer

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *