Written by Reinder de Vries on July 12 2020 In App Development, Swift

FlatMap ja CompactMap selitetty Swift

Swift sisältää joukon funktioita, jotka ovat hyödyllisiä kokoelmien ja sekvenssien muuntamisessa. Tässä opetusohjelmassa käsitellään map(_:), flatMap(_:) ja compactMap(_:).

tähän keskitymme:

  1. miten map(_:) muuttaa kokoelmaa tai sekvenssiä sulkemalla sen
  2. miten flatMap(_:) voi litistää tuloryhmän, soitettuaan map(_:)
  3. miten compactMap(_:) poistaa nil tuloryhmästä

aiemmassa tutoriaalissa olemme keskustelleet siitä, miten voit käyttää filter(_:) ja reduce(_:). Nämä korkeamman kertaluvun toiminnot ovat erittäin hyödyllisiä kokoelmien muuttamiseksi tiiviillä ja oivaltavalla tavalla.

valmis? Mennään.

  1. Karttafunktion käyttäminen Swiftissä
  2. FlatMap-Funktion käyttäminen
  3. CompactMap-Funktion käyttäminen
  4. Miksi käyttää FlatMap-ja CompactMap-funktiota?
  5. lisätietoja

Etkö vielä tunne sulkemisia tai korkeamman kertaluvun toimintoja? Muista lukea ne ensin:

  • the Ultimate Guide to Closures in Swift
  • Map, Reduce and Filter in Swift

käyttämällä Karttafunktiota Swiftissä

nopeana kertauksena Swiftin korkeamman kertaluvun funktioista, lähtökohtana on map(_:) – funktio. Tämä funktio soveltaa transformaatiota jokaiseen alkuaineeseen jonossa, kuten taulukkoon tai sanakirjaan.

tässä esimerkki:

let numbers =
let result = numbers.kartta({ $0 * $0 })
printti(tulos)
piilota varoitukset

hajotetaan se:

ensin luodaan joukko numbers, jossa on muutama kokonaisluku. Tällöin funktio map(_:) kutsutaan numbers ja sen tulos annetaan result.

map(_:) funktiolla on yksi parametri, sulkeutuminen, joka palauttaa tuloksen . vastaa sulkeuman ensimmäistä parametria, eli muuttuvaa lukua numbers.

lasketaan jokaisen luvun neliö numbers. Pohjimmiltaan operaatio kutsutaan jokaiselle numerolle numbers, ja tuloksena oleva joukko merkitään result. Muutat – tai” kartoitat ” – yhden array toiseen.

jonon muuttaminen map(_:): llä on samanlaista kuin for-silmukan käyttäminen, mutta paljon tiiviimpää. Näin:

let numbers = var result = ()for number in numbers { result += }print(result)

tässä on toinen tapa katsoa sitä. Kun map(_:), tulolukujen joukko muuttuu toiseksi lukujoukoksi. Näin:

2 => 2 * 2 => 43 => 3 * 3 => 94 => 4 * 4 => 165 => 5 * 5 => 25

funktioita, kuten map(_:), kutsutaan korkeamman kertaluvun funktioiksi, koska ne ottavat funktion tulona tavallisten arvojen sijaan. Korkeamman kertaluvun funktiot voivat myös tuottaa funktioita, mikä on hyödyllinen funktionaaliseksi ohjelmoinniksi kutsutussa ohjelmointiparadigmassa.

teknisesti korkeamman kertaluvun funktioita, kuten map(_:), voi kutsua mihin tahansa järjestykseen. Tämä sisältää kokoelmia, kuten taulukoita, sanakirjoja ja sarjoja, vaihteluvälejä kuten 1...100 ja niin sanottuja iteraattoreita. Mitä tahansa, joka näyttää arvolistalta.

keskustelemme tämän opetusohjelman lopussa siitä, miksi korkeamman kertaluvun funktiot ovat hyödyllisiä. Siirrytään ensin lukemaan flatMap(_:) ja compactMap(_:).

Hanki työpaikka iOS-kehittäjänä

Opi rakentamaan iOS 14-sovelluksia Swift 5: llä

Rekisteröidy iOS development course-kurssille ja opi aloittamaan urasi ammattimaisena iOS-kehittäjänä.

käyttämällä FlatMap-funktiota

flatMap(_:) funktio on samanlainen kuin map(_:), paitsi että se” litistää ” tuloksena olevan joukon. Tässä esimerkki:

let numbers =,,]
let result = numbers.flatMap ({$0 })
print (tulos)
piilota varoitukset

yllä oleva koodi alkaa kokonaislukujen sisäkkäisellä joukolla. numbers array koostuu 3 Array, että jokainen sisältää 3 numeroa.

sulkeminen { } palauttaa yksinkertaisesti sulkemisen ensimmäisen argumentin eli yksittäiset sisäkkäiset ryhmät. Mitään muutosta tai operaatiota ei ole tapahtumassa. Kun flatMap(_:) soittaa numbers array kuitenkin, sijaan map(_:), päädytään litistetty joukko yksittäisiä numeroita. Toisin kuin tuloryhmä numbers, tuloryhmä ei sisällä sisäkkäisiä ryhmiä!

katsotaanpa toista esimerkkiä. Kuvittele, että työskentelet 4 ryhmän kirahveja kanssa ja haluat luoda yhden ryhmän kirahveja, jotka ovat pitempiä kuin tietty korkeus. Näin teet sen:

let giraffes =,,]
let tallest = giraffes.flatMap ({ $0.suodatin({ $0 > 10 }) })
print(korkein)
piilota varoitukset

Katso miten giraffes sisältää joukon taulukoita? Yllä olevassa koodissa funktio filter(_:) kutsutaan jokaiselle sisäkkäiselle joukolle sisällä giraffes. Haluamme vain kokonaislukuja (kirahveja!) jotka ovat suurempia kuin 10. Tuloksena olevat ryhmät litistetään yhdeksi ”tasaiseksi” ryhmäksi, ja annetaan tallest.

mieti, mitä tapahtuisi, jos olisimme käyttäneet map(_:) sijasta flatMap(_:). Tuloksena oleva array ei olisi litistynyt. Sen sijaan, se olisi tämä:

, , ]

on tärkeää huomata, että flatMap(_:) funktio kutsuu map(_:) array-kohteita ensin ja litistää sen sitten. Siksi jokin seuraava ei toimi:

let numbers = , , ]let result = numbers.flatMap({  * 2 })

yllä olevassa koodissa viittaa numeroiden sisällä oleviin matriiseihin. Matriisin kertominen kahdella on mahdotonta, joten siksi tämä koodi ei toimi.

on fiksua ajatella, että flatmapping näkisi array yhden ulottuvuuden vähemmän. Aloitetaan kaksiulotteisesta jonosta ja päädytään yksiulotteiseen jonoon flatMap(_:)jälkeen.

entä flatMap(_:) käyttäminen vaihtoehtojen kanssa? Katsotaan sitä seuraavaksi.

nimi ”kompakti kartta” perustuu ajatukseen, jonka mukaan nil kohteiden poistaminen joukosta tekee joukosta kompaktimman. Samoin, nimi ”flat map” tulee flattening array. Ja ”kartoitus” on matematiikasta peräisin oleva käsite, jossa yhden joukon arvot yhdistetään toiseen joukkoon.

käyttäen CompactMap-funktiota

compactMap(_:) funktio poistaa nil arvot tuloryhmästä. Se on erittäin hyödyllinen, kun työskentelet vaihtoehtojen kanssa.

Ennen Swiftin 4.1, flatMap(_:) funktiota (yllä) voidaan käyttää myös suodattamaan nil arvot litistetyistä ryhmistä. Koska Swift 4.1+, käytät nyt nimenomaista compactMap(_:) tähän tarkoitukseen.

tässä esimerkki:

let numbers =
let result = numbers.compactMap ({Int ($0)})
print (tulos)
piilota varoitukset

Katso mitä tapahtuu? Koodin tärkein osa on Int(). Tämä vaatii yksittäisen merkkijonon numbers, jolla on , ja yrittää muuntaa kokonaisluvuksi, jossa on Int() initializer.

tämä Int() initializer on epäonnistunut:se voi palauttaa nil – valinnainen – joten sen palautustyyppi on Int?. Tämän seurauksena karttamuunnoksen paluutyyppi on – joukko valinnaisia kokonaislukuja.

compactMap(_:) funktio poistaa automaattisesti nil elementtejä palautetusta joukosta, soitettuaan map(_:) sille. Sellaisenaan sen palautustyyppi ei ole valinnainen.

edellä mainitun koodin tyyppi result on . Jos olisit käyttänyt map(_:), palautustyyppi olisi ollut . Ja olisit tarvinnut ylimääräisen askeleen, jotta olisit voinut avata arvot, työskennellä niiden kanssa.

miksi FlatMap – ja CompactMap-tabletteja käytetään?

ennen kuin keskustelemme flatmapin ja compactmapin reaalimaailman käyttötapauksista, tehdään nopea kertaus näistä korkeamman asteen funktioista ja niiden tarkoituksista.

  1. map(_:) funktio sulkee syötetyn kokoelman ja Palauttaa muunnetun kokoelman
  2. flatMap(_:) funktio tekee saman, ja se myös litistää tuloksena olevan kokoelman
  3. compactMap(_:) funktio tekee saman kuin map(_:), ja se myös poistaa nil tuloksena olevasta kokoelmasta

työskentely map(_:), flatMap(_:) ja compactMap(_:) kanssa abstraktisti tekee joskus vaikeaksi kuvitella niiden käytännön käyttötapauksia. Keskustellaan, miksi haluat käyttää niitä.

funktioiden, kuten map (_:), käyttäminen muunnosten soveltamiseen sekvensseihin on muutamia etuja:

  • se on suppeampi kuin for silmukan käyttäminen, koska ei tarvita väliaikaisia muuttujia ja monirivistä for in { } lohkoa.
  • voit tyypillisesti kirjoittaa puhelun map(_:) yhdelle riville, mikä (yleensä) tekee koodistasi luettavamman.
  • funktiot kuten map(_:) voidaan ketjuttaa, joten jonoon voi soveltaa useita muunnoksia yksitellen.

yleensäkin korkeamman kertaluvun funktiot ovat hyödyllisiä, koska niiden avulla funktiota voidaan soveltaa jonoon arvoja. Sen sijaan, että koodaat muunnoksen proseduraalisesti, voit vain soveltaa toimintoa ja saada tuloksen takaisin.

flatMap(_:) käytännöllisin käyttötapaus on työskentely syöttöarvoilla, jotka ovat ryhmitettyjä eli sisäkkäisiä, mutta haluamasi lähtöarvon on oltava yksiulotteinen.

esimerkiksi musiikkisovelluksessa voisi olla 3 arrayta: kappaleita, artisteja ja soittolistoja. Ne yhdistetään yhdeksi riviksi, siihen soitetaan flatMap(_:), valitaan kappaleet, Artistit ja soittolistat, joille isFavorite on true, ja päädytään yhteen tasaiseen listaan suositelluista kappaleista.

käytännön käyttötapaus compactMap(_:) toimii muunnoksella, joka voi palata nil. Säästät muutaman triviaalin askeleen antamalla compactMap(_:) suodattaa nil arvot välittömästi. Lisäetu on compactMap(_:) ’ s non-optional return type; filter(_:) funktio olisi vertailun vuoksi palauttanut valinnaisen arvon, jos olisit suodattanut pois nil.

voit yhdistää flatMap(_:) ja compactMap(_:), ja jopa filter(_:) tai reduce(_:_:). Kuvittele rakentavasi sosiaalisen median sovellusta. Haluat luoda aikajanan viestejä käyttäjälle. Käytät 3 kyselyt valita post tunnukset käyttäjälle, esimerkiksi seuraaja virkaa, mainoksia, ja trendit aiheita.

  • voit käyttää map(_:) näiden tunnusten laajentamiseen varsinaisiksi Post objekteiksi
  • voit käyttää flatMap(_:) 3 ryhmän litistämiseen yhdeksi kokoelmaksi
  • voit käyttää compactMap(_:) sellaisten viestien hävittämiseen, joita ei voitu laajentaa

Neat!

Hanki työpaikka iOS-kehittäjänä

Opi rakentamaan iOS 14-sovelluksia Swift 5: llä

Rekisteröidy iOS development course-kurssille ja opi aloittamaan urasi ammattimaisena iOS-kehittäjänä.

lisätietoja

kannattaa tutustua map(_:), flatMap(_:) ja compactMap(_:), koska ne tekevät koodista tiiviimmän ja luettavamman. Sovelluksen koodiin voi lisätä enemmän toiminnallista ohjelmointia. Kun niihin tottuu, ei voi uskoa, että voisi tehdä työnsä ilman niitä.

erityisesti erot map(_:), flatMap(_:) ja compactMap(_:) välillä ovat huomionarvoisia. Ensimmäinen soveltaa muunnosta jonoon,toinen litistää tuloksena olevan joukon ja kolmas poistaa nil arvot ennen kuin palauttaa tuloksensa. Mahtavaa!

Vastaa

Sähköpostiosoitettasi ei julkaista.