Kiwi and Lemon

Il metodo reduce di Array in Swift

La Struct Array in Swift espone il metodo reduce, si tratta di una funzionalità molto potete che permette di ridurre il contenuto di tutto l’array a un singolo valore.

Cerchiamo di capire meglio, questa è la dichiarazione del metodo:

  • U è il tipo del valore che otterremo come risultato (a cui verrà ridotto l’intero Array insomma)
  • T è il tipo dell’Array su cui invochiamo reduce
  • combine è una funzione che riceve 2 parametri: il primo è l’accumulatore del risultato mentre il secondo è l’i-esimo valore dell’Array. Questa funzione restituisce un valore di tipo U.

In realtà si tratta di un concetto più semplice di quanto sembra e l’esempio successivo lo dimostra.

Ottenere la somma dei valori di un Array di Int

Questo potrebbe essere uno scenario abbastanza comune. Abbiamo il seguente codice:

E vogliamo ottenere la somma di tutti i valori (assolutamente senza scrivere un ciclo FOR perché non è in stile Functional Programming).

Cosa è successo?

Il metodo reduce ha preso il valore 0 (passato come primo parametro), poi ha estratto il primo valore dell’Array (quindi 1) e ha applicato la funzione sum a questi 2 interi ottenendo il valore 1.

A questo punto il risultato (1) sommato (sempre applicando la funzione sum) al secondo elemento dell’array ottenendo 3.

E così via fino a ottenere 21.

Possiamo scrivere lo stesso codice in modo più compatto usando la tecnica della trailing closure.

Contare il numero caratteri in un Array di String

Il metodo reduce è disponibile su un Array di qualsiasi tipo. Creiamo un Array di String.

Vogliamo ora contare il numero totale di caratteri presenti nell’Array.

Il primo primo parametro che stiamo passando a reduce è 0. Quello è il valore iniziale del conteggio dei caratteri. Il secondo parametro è una closure passata con la tecnica della trailing closure (ovvero aggiungendo del codice racchiuso tra { } dopo l’invocazione del metodo reduce. La closure restituisce il valore conteggiato fino allo step corrente + il numero di caratteri dell’iesima stringa contenuta nell’Array.

@noescape

Torniamo un attimo alla definizione del metodo reduce.

Il parametro combine è dichiarato come una funzione ed è annotato da @noescape. Cosa significa?

In genere quando passiamo una closure a un metodo non abbiamo alcuna garanzia che il codice che includiamo nella closure verrà eseguito in modo sincrono. E’ possibile ad esempio che il metodo esegua una chiamata a un web service e che esegua la closure solo quando il server ha risposto. Questo significa che l’esecuzione del programma potrebbe continuare e che il codice che scriviamo nella closure potrebbe essere invocata in un momento imprecisato del futuro.

Bene, quando un parametro che accetta una closure è annotato con @noescape significa che abbiamo la garanzia che il codice della closure verrà eseguito in modo sincrono: quindi il codice alla riga successiva verrà eseguito solo dopo l’ultima invocazione della closure.

Conclusione

Abbiamo esplorato il terzo (dopo filter e map) dei 3 potenti metodi della classe Array che permettono di scrivere codice usando il paradigma della Functional Programming. Se avete domande usate i commenti qui sotto. E non dimenticate di condividere questo post sui social!

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

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