Kulissien takana tarkastellaan karttaa, suodatusta ja vähennystä Swiftissä

Funktio vie jonkin verran syötettä, tekee sille jotain ja luo ulostulon. Funktiolla on allekirjoitus ja runko. Jos annat saman tulon funktiolle, saat aina saman tuloksen. Se on lyhyesti funktion määritelmä .

Nyt puhumme lisää toiminnoista tutustumalla niihin tarkemmin. Tutkimme korkeamman tason toimintoja Swiftissä. Toimintoa, joka ottaa toisen funktion syötteeksi tai palauttaa toiminnon, kutsutaankorkeamman asteen toiminto .

Swiftissä pelataan kartalla, suodatetaan, vähennetään päivittäin. Kun käytämme näitä toimintoja, se näyttää taikuudelta. Tässä vaiheessa sinulla ei ehkä ole aavistustakaan siitä, mitä kulissien takana tapahtuu. Kartoita, suodata ja vähennä työtä toiminnallisen ohjelmoinnin ideoiden ja lähestymistapojen avulla. Vaikka Swift ei ole puhdas toiminnallinen kieli, sen avulla voit tehdä toiminnallisia asioita.

Katsotaan nyt yksi kerrallaan, mitä heille taustalla tapahtuu. Ensin toteutamme näiden toimintojen perusversiot tietyille tietotyypeille, sitten yritämme toteuttaa yleisen version.

Karttatoiminto

Oletetaan, että meillä on joukko kokonaislukuja ja meidän on kirjoitettava funktio, joka palauttaa uuden taulukon sen jälkeen, kun olet lisännyt jonkin verran delta-arvoa alkuperäisen taulukon jokaiseen elementtiin. Voimme helposti kirjoittaa toiminnon tälle käyttämällä yksinkertaista silmukkaa kuten alla:

Tarvitsemme toisen toiminnon, joka palauttaa uuden taulukon kaksinkertaistamalla alkuperäisen taulukon jokaisen elementin. Tätä varten voimme toteuttaa sen seuraavasti:

Jos tarkastelemme kahta yllä olevaa toimintoa, voimme havaita, että ne tekevät periaatteessa samaa asiaa. Vain toiminnot for-silmukan sisällä ovat erilaiset. Molemmat ottavat Integer- taulukon syötteenä, muuttavat jokaisen elementin for for -silmukalla ja palauttavat uuden taulukon. Joten pääasia on muuttaa jokaisen elementin uudeksi.

Koska Swift tukee korkeamman asteen funktioita, voimme kirjoittaa funktion, joka ottaa kokonaislukujoukon, muuntaa funktion syötteenä ja palauttaa uuden taulukon soveltamalla muunnosfunktiota alkuperäisen taulukon kuhunkin osaan.

Mutta silti, yllä on ongelma: se palauttaa vain kokonaisluvun. Jos meillä on vaatimus muuntaa syötetty kokonaisluku taulukko merkkijonotaulukoksi, emme voi tehdä sitä tällä toiminnolla. Tätä varten meidän on kirjoitettava yleinen toiminto, joka toimii mille tahansa tyypille.

Voimme toteuttaa yleisen toiminnon tällaisessa Array-laajennuksessa:

  1. Ilmoita karttatoiminto Array-laajennuksessa, joka toimii yleisen tyypin T kanssa .
  2. Funktio ottaa tyypin funktion (Element) -> ; T tulona
  3. Ilmoita tyhjä tulosryhmä, joka sisältää T- tyypin tiedot funktion sisällä.
  4. Toteuta a silmukan iteroinnille ja kutsu muunnosfunktiota, jotta elementti muunnetaan tyypiksi T
  5. Liitä muunnettu arvo saatuun matriisiin

Näin karttatoiminto toimii Swiftissä. Jos meidän on toteutettava karttatoiminto , sitten toteutamme sen kuten yllä. Joten pohjimmiltaan se ei saa aikaan mitään taikuutta taulukossa - olisimme voineet helposti määritellä toiminnon itse.

Suodatintoiminto

Oletetaan, että meillä on joukko kokonaislukuja ja haluamme pitää taulukossa vain parilliset luvut. Voimme toteuttaa tämän käyttämällä yksinkertaista silmukalle:

Sano jälleen kerran, että meillä on joukko merkkijonoja, jotka edustavat projektin luokan tiedostojen nimiä, ja haluamme säilyttää vain . nopeita tiedostoja. Tämä voidaan tehdä myös yhdellä silmukalla kuten alla:

Jos tarkastelemme tarkasti kahden yllä olevan toiminnon toteuttamista, voimme ymmärtää, että ne tekevät periaatteessa saman asian - vain tietotyyppi on erilainen kahdelle matriisille. Voimme yleistää tämän toteuttamalla yleisen suodatintoiminnon, joka ottaa syötteenä matriisin ja funktion, ja riippuen includeElement- funktion tuotoksesta se päättää lisätäkö elementti tuloksena olevaan matriisiin.

Vähennä toimintoa

Oletetaan, että meillä on joukko kokonaislukuja ja haluamme toteuttaa kaksi toimintoa, jotka palauttavat elementtien summan ja tulon. Voimme toteuttaa tämän käyttämällä yksinkertaista silmukalle:

Nyt sen sijaan, että meillä olisi joukko kokonaislukuja, sanokaa, että meillä on joukko merkkijonoja ja haluamme liittää kaikki matriisin elementit:

Kaikki kolme toimintoa tekevät periaatteessa saman asian. He ottavat taulukon syötteeksi, alustavat tuloksena olevan muuttujan, iteroivat taulukon yli ja päivittävät tuloksena olevan muuttujan.

Täältä voimme toteuttaa yleisen toiminnon, jonka pitäisi toimia kaikille. Tätä varten tarvitsemme tuloksena olevan muuttujan alkuarvon ja toiminnon päivittääksesi muuttujan jokaisessa iteraatiossa.

Joten voimme toteuttaa yleisen funktion seuraavalla määritelmällä:

Yllä oleva toteutus on yleinen kaikille [Element] -tyyppisille syöttöryhmille. Se laskee tyypin T tuloksen . Toimiakseen se tarvitsee tyypin T alkuarvon, jotta se voidaan määrittää tuloksena olevalle muuttujalle. Sitten se tarvitsee tyypin funktion (T, Element) -> T, jota käytetään for-silmukan sisällä kussakin iteraatiossa saadun muuttujan päivittämiseksi.

Kiitos, että luit!