En bag kulisserne ser på Map, Filter og Reduce in Swift

En funktion tager noget input, gør noget ved det og skaber et output. En funktion har en signatur og en krop. Hvis du giver den samme indgang til en funktion, får du altid den samme udgang. Det er kort sagt en definition for funktionen .

Nu vil vi tale mere om funktioner ved at se nærmere på dem. Vi vil udforske højere ordensfunktioner i Swift. En funktion, der tager en anden funktion som input eller returnerer en funktion kaldesen højere ordensfunktion .

I Swift leger vi med kort, filtrerer, reducerer hver dag. Når vi bruger disse funktioner, virker det som magi. På dette tidspunkt har du muligvis ikke en idé om, hvad der foregår bag kulisserne. Kortlæg, filtrer og reducer arbejde gennem ideer og tilgange til funktionel programmering. Selvom Swift ikke er et rent funktionelt sprog, giver det dig mulighed for at gøre funktionelle ting.

Lad os nu se en efter en, hvad der sker i baggrunden for dem. Først implementerer vi de grundlæggende versioner af disse funktioner til nogle bestemte datatyper, så prøver vi at implementere en generisk version.

Kortfunktion

Lad os sige, at vi har en række heltal, og vi skal skrive en funktion, der returnerer en ny matrix efter at have tilføjet en delta-værdi til hvert element i den oprindelige matrix. Vi kan nemt skrive en funktion til dette ved hjælp af en simpel for loop som nedenfor:

Nu har vi brug for en anden funktion, der returnerer et nyt array ved at fordoble hvert element i det originale array. Til dette kan vi implementere det som nedenfor:

Hvis vi ser på ovenstående to funktioner, kan vi finde ud af, at de stort set gør det samme. Kun funktionaliteten inde i for loop er anderledes. De tager begge et heltal array som input, transformerer hvert element ved hjælp af en for loop og returnerer et nyt array. Så dybest set er det vigtigste at omdanne hvert element til noget nyt.

Da Swift understøtter højere ordensfunktioner, kan vi skrive en funktion, der tager en række heltal, transformerer funktionen som input og returnerer en ny matrix ved at anvende transformeringsfunktionen til hvert element i den oprindelige matrix.

Men der er stadig et problem med ovenstående: det returnerer kun et heltal array. Hvis vi f.eks. Har et krav om at konvertere input-heltal-array til en string-array, kan vi ikke gøre det med denne funktion. For at gøre det skal vi skrive en generisk funktion, der fungerer for enhver type.

Vi kan implementere en generisk funktion i en Array-udvidelse som denne:

  1. Erklær et kort funktion i Array Extension der arbejder med en generisk type, T .
  2. Funktionen tager en funktion af typen (Element) -> ; T som input
  3. Erklær et tomt resultatarray, der holder T- typens data inde i funktionen.
  4. Implementér a for loop iterering af sig selv og kald transformationsfunktionen for at konvertere elementet til type T
  5. Tilføj den konverterede værdi i det resulterende array

Sådan fungerer kortfunktionen i Swift. Hvis vi har brug for at implementere kortetfunktion , så ville vi implementere det som ovenfor. Så dybest set får det ingen magi til at ske i en matrix - vi kunne nemt have defineret funktionen selv.

Filterfunktion

Antag, at vi har en række heltal, og vi vil kun beholde lige tal i matrixen. Vi kan implementere dette ved hjælp af en simpel for loop:

Sig igen, at vi har en række strenge, der repræsenterer klasse-filnavne på et projekt, og vi vil kun beholde . hurtige filer. Dette kan også gøres med en enkelt løkke som nedenfor:

Hvis vi ser nærmere på implementeringen af ​​de ovennævnte to funktioner, kan vi forstå, at de stort set gør det samme - kun datatypen er forskellig for de to arrays. Vi kan generalisere dette ved at implementere en generisk filterfunktion, der tager en matrix og en funktion som input, og afhængigt af output fra includeElement- funktionen beslutter den, om elementet skal tilføjes i det resulterende array.

Reducer funktion

Antag, at vi har en række heltal, og at vi ønsker at implementere to funktioner, som returnerer summen og produktet af elementerne. Vi kan implementere dette ved hjælp af en simpel for loop:

Nu i stedet for at have et array af heltal, siger vi, at vi har en række strenge, og vi vil sammenkæde alle elementerne i arrayet:

Alle tre funktioner gør dybest set den samme ting. De tager en matrix som input, initialiserer en resulterende variabel, gentages over matrixen og opdaterer den resulterende variabel.

Herfra kan vi implementere en generisk funktion, der skal fungere for alle. For at gøre dette har vi brug for den oprindelige værdi af den resulterende variabel og funktionen til at opdatere den variabel i hver iteration.

Så vi kan implementere den generiske funktion med følgende definition:

Ovenstående implementering er generisk for ethvert input-array af typen [Element]. Det vil beregne et resultat af typen T . For at arbejde har det brug for en indledende værdi af type T for at tildele en resulterende variabel. Derefter har den brug for en funktion af typen (T, Element) -> T, som vil blive brugt inde i for-sløjfen i hver iteration for at opdatere den resulterende variabel.

Tak fordi du læste!