Užkulisiuose žiūrėkite „Map“, „Filter“ ir „Reduce“ programoje „Swift“

Funkcija ima tam tikrą įvestį, daro jai kažką ir sukuria išvestį. Funkcija turi parašą ir turinį. Jei funkcijai suteikiate tą patį įvestį, visada gaunate tą patį išėjimą. Tai trumpai apibūdina funkciją .

Dabar mes daugiau kalbėsime apie funkcijas, atidžiau jas pažvelgdami. Mes ištirsime aukštesnio lygio funkcijas „Swift“. Vadinama funkcija, kuri ima kitą funkciją kaip įvestį arba grąžina funkcijąaukštesnės eilės funkcija .

„Swift“ žaidžiame su žemėlapiu, filtruojame, kasdien mažiname . Kai mes naudojame šias funkcijas, tai atrodo kaip magija. Šiuo metu jūs negalite įsivaizduoti, kas vyksta užkulisiuose. Žemėlapis, filtravimas ir sumažinimas naudojant funkcinio programavimo idėjas ir metodus. Nors „Swift“ nėra gryna funkcinė kalba, ji leidžia jums atlikti funkcinius dalykus.

Dabar pažiūrėkime, kas jiems vyksta fone. Pirmiausia įgyvendinsime pagrindines šių funkcijų versijas tam tikriems duomenų tipams, tada bandysime įdiegti bendrą versiją.

Žemėlapio funkcija

Tarkime, kad turime sveikųjų skaičių masyvą ir turime parašyti funkciją, kuri grąžina naują masyvą, pridėjus šiek tiek delta reikšmės kiekvienam pradinio masyvo elementui. Mes galime lengvai parašyti tam skirtą funkciją naudodami paprastą ciklą, kaip nurodyta toliau:

Dabar mums reikia kitos funkcijos, kuri grąžina naują masyvą, padvigubindama kiekvieną pradinio masyvo elementą. Tam mes galime tai įgyvendinti taip, kaip nurodyta toliau:

Pažvelgę ​​į pirmiau minėtas dvi funkcijas, galime pastebėti, kad jos iš esmės daro tą patį. Skiriasi tik „for loop“ funkcionalumas. Jie abu ima sveikąjį masyvą, transformuoja kiekvieną elementą naudodami „for“ kilpą ir grąžina naują masyvą. Taigi iš esmės pagrindinis dalykas yra paversti kiekvieną elementą nauju.

Kadangi „Swift“ palaiko aukštesnės eilės funkcijas, galime parašyti funkciją, kuri ims sveikųjų skaičių masyvą, transformuos funkciją kaip įvestį ir grąžins naują masyvą, pritaikydama transformavimo funkciją kiekvienam pradinio masyvo elementui.

Tačiau vis tiek yra problema, susijusi su aukščiau išdėstytomis problemomis: ji pateikia tik sveikojo skaičiaus masyvą. Pavyzdžiui, jei turime reikalavimą konvertuoti įvesties sveikojo skaičiaus masyvą į eilutės masyvą, tai negalime padaryti naudodami šią funkciją. Norėdami tai padaryti, turime parašyti bendrą funkciją, kuri tinka bet kokiam tipui.

Masyvo plėtinyje galime įdiegti bendrą funkciją:

  1. Masyvo plėtinyje paskelbkite žemėlapio funkciją, kuri veikia su bendruoju T tipu .
  2. Funkcija užima tipo funkciją (Elementas) -> ; T kaip įvestis
  3. Paskelbkite tuščią rezultatų masyvą, kuriame funkcijoje yra T tipo duomenys.
  4. Įdiekite kilpos iteraciją ir iškvieskite transformavimo funkciją, kad elementas būtų konvertuotas į T tipą
  5. Pridėkite konvertuotą vertę gautame masyve

Taip „Swift“ veikia žemėlapio funkcija. Jei mums reikia įgyvendinti žemėlapįfunkciją , tada mes ją įgyvendintume kaip aukščiau. Taigi iš esmės masyvas nepriverčia jokios magijos - mes patys galėtume lengvai apibrėžti funkciją.

Filtro funkcija

Tarkime, kad turime sveikųjų skaičių masyvą ir norime masyve palikti tik lyginius skaičius. Tai galime įgyvendinti naudodami paprastą ciklą:

Dar kartą sakykime, kad turime eilutes, žyminčias projekto klasių failų pavadinimus, ir norime pasilikti tik . greiti failai. Tai taip pat galima padaryti su viena kilpa, kaip nurodyta toliau:

Atidžiai išnagrinėję pirmiau minėtų dviejų funkcijų įgyvendinimą, galime suprasti, kad jie iš esmės daro tą patį - abiejų masyvų skiriasi tik duomenų tipas. Tai galime apibendrinti įgyvendindami bendrą filtro funkciją, kuriai kaip įvestis reikia masyvo ir funkcijos, ir, atsižvelgiant į funkcijos includeElement išvestį , jis nusprendžia, ar pridėti elementą į gautą masyvą.

Sumažinti funkciją

Tarkime, kad turime sveikų skaičių masyvą ir norime įgyvendinti dvi funkcijas, kurios grąžina elementų sumą ir sandaugą. Tai galime įgyvendinti naudodami paprastą ciklą:

Užuot turėję sveikųjų skaičių masyvą, tarkime, kad turime eilutes ir norime susieti visus masyvo elementus:

Visos trys funkcijos iš esmės atlieka tą patį. Jie ima masyvą kaip įvestį, inicijuoja gautą kintamąjį, pakartoja masyvą ir atnaujina gautą kintamąjį.

Čia galime įgyvendinti bendrą funkciją, kuri turėtų veikti visiems. Norėdami tai padaryti, mums reikia pradinės gauto kintamojo vertės ir funkcijos, kad atnaujintume tą kintamąjį kiekvienoje iteracijoje.

Taigi galime įgyvendinti bendrąją funkciją su tokiu apibrėžimu:

Pirmiau pateiktas įgyvendinimas yra bendras bet kokio tipo [Element] įvesties masyvui . Jis apskaičiuos T tipo rezultatą . Norint dirbti, jam reikia pradinės T tipo vertės, kad būtų galima priskirti gautam kintamajam. Tada jai reikalinga tipo funkcija (T, Element) -> T, kuri bus naudojama for it ciklui kiekvienoje iteracijoje, kad būtų atnaujintas gautas kintamasis.

Ačiū, kad skaitėte!