Kuinka luoda mukautettu operaattori (kuten ~ = operaattori) nopeasti? -

Olen nähnyt kehittäjien käyttävän mukautettuja operaattoreita, mikä lisää koodille merkitystä ja vähentää operaation suorittamiseen tarvittavan koodin määrää. Mukautettujen operaattoreiden luomista ei kannusteta. Mutta voit silti, jos haluat !!.

Olin opiskellut kuvioiden sovittamista nopeasti ja silmäni jumissavat erityisestä operaattorista ~ =. Olen käyttänyt tätä aikaisemmin kuvioiden sovittamiseen, mutta en tiennyt miten se toimii. Olen käyttänyt ~ = operaattoria tarkistaaksesi, kuuluuko http-virhe johonkin tietylle alueelle (halusin tarkistaa, onko virhe 4xx lukuun ottamatta 401) näin:

Minulla ei ollut aavistustakaan, mitä se tekee sisäisesti. En tiennyt myös, että voimme myös luoda tällaisia ​​mukautettuja operaattoreita. Joten kysyin googleltä tästä ja hän näytti minulle kaikki mitä halusin.

Katsokaa joitain tällaisista operaattoreista nopeasti: Määrittää Swift

Operaattorityypit

Nopeasti toimivat operaattorit jakautuvat seuraaviin tyyppeihin:

  • Infix - käytetään kahden arvon välillä (esimerkiksi: + )
  • Etuliite - Käytetään ennen arvoa (esimerkiksi:! )
  • Postfix - Käytetään arvon jälkeen (esimerkiksi: !)
  • Ternary - Kaksi symbolia asetettu kolmen arvon väliin (esim. ? : ). Emme voi luoda mukautettuja kolmen osapuolen operaattoreita nyt. Swift ei salli kehittäjien tehdä tätä.

Kuinka luoda mukautettuja operaattoreita?

Luodaan mukautettu operaattori numeron neliöjuuren löytämiseksi √ -symbolin avulla.

Huomaa: Meillä on jo sqrt () -toiminto neliöjuuren löytämiseksi, ja se on helppo käyttää. Pidä tätä yksinkertaisena esimerkkinä luoda mukautettuja operaattoreita create.

Meidän pitäisi käyttää tätä etuliiteoperaattorina, kuten:

anna jotkutVal = 25
anna squareRoot = √someVal // tulos on 5

Keskustelemme sen luomisen vaiheista.

  • Meidän on julistettava tämä symboli √ etuliiteoperaattoriksi.
etuliitteen operaattori √
  • Meidän on luotava toiminto, joka hyväksyy yhden parametrin, ja suoritettava toiminto (neliöjuuri).
etuliite func √ (lhs: Tupla) -> Tupla {
paluu sqrt (lhs)
}

TEHTY!! - - - Onnittelut!!. Loit juuri mukautetun etuliitteen operaattorin neliöjuuren löytämiseksi.

Muokattu neliöjuurioperaattori nopeasti

Luodaan mukautettu infix-operaattori ◉-symbolilla.

◉ Operaattoritoiminto hyväksyy kaksi arvoa lhs ja rhs ja palauttaa näiden arvojen neliöiden summa. toisin sanoen; jos lhs on 2 ja rhs on 3, tulos on 4 + 9. eli; 13.

Jos muistat vaiheet,

  • Meidän on julistettava tämä ◉-symboli infiksioperaattorina.
infix-operaattori ◉
  • Meidän on luotava toiminto, joka hyväksyy kaksi parametria, ja suoritettava yllä selitetty toiminto.
infix func ◉ (lhs: tupla, rhs: tupla) -> tupla {
paluu lhs * lhs + rhs * rhs
}

Jos teet tämän, kääntäjä huutaa sinulle sanomalla: virhe: MyPlayground.playground: 14: 1: virhe: 'infix' -muokkainta ei tarvita tai sallita func-ilmoituksissa.

Joten kirjoita toiminto uudelleen poistamalla infix-avainsana.

 func ◉ (lhs: tupla, rhs: tupla) -> tupla {
paluu lhs * lhs + rhs * rhs
}

Onnittelut. Loit juuri mukautetun infix-operaattorin. Mutta odota. Onko se?

Kysymys: Onko se? Onko meidän harkittava jotain muuta luotaessa mukautettuja operaattoreita?

Vastaus: KYLLÄ !!! .. Melkein unohdin opettajan etusijan, jonka opimme koulussa.

Viitesivut: Toimenpiteet, Käyttäjän ilmoitukset.

Matematiikassa ja useimmissa tietokonekielissä kertolaskuilla on suurempi etusija kuin lisäyksillä. Siksi lausekkeen 2 + 3 × 4 tulkitaan olevan arvo 2 + (3 × 4) = 14, ei (2 + 3) × 4 = 20. Meidän on myös otettava tämä huomioon, kun luomme räätälöityä operaattoria. Operaattorien etusija on tärkeä tekijä.

Ensisijaisuus ja assosiatiivisuus

Apple Docs Link täältä.

Operaattorijärjestys antaa joillekin operaattoreille korkeamman prioriteetin kuin toiset; näitä operaattoreita sovelletaan ensin.

Operaattorien assosiaatio määrittelee, kuinka saman prioriteetin operaattorit on ryhmitelty toisiinsa - joko ryhmitetty vasemmalta tai oikealta. Ajattele sen tarkoittavan "he yhdistyvät lauseeseen vasemmalla" tai "he yhdistyvät lauseeseen oikealla puolella".

Tyypit, joilla on vasen assosiatiivisuus, jäsennetään siten, että v1 + v2 + v3 == (v1 + v2) + v3. Oikeassa assosiatiivisuudessa on päinvastoin.

Jos ilmoitat uuden operaattorin määrittelemättä etusijaryhmää, se on DefaultPrecedence -järjestysryhmän jäsen. DefaultPrecedenssilla ei ole assosiatiivisuutta ja etusija on välittömästi korkeampi kuin TernaryPrecedence.
Lähde: raywenderlich

Katso Apple-dokumentit saadaksesi koko luettelo operaattoreista, joita käytetään nopeasti, yksityiskohtaisineen.

Palaamalla ◉-infix-operaattorimme, se ei sovi mihinkään tavanomaiseen prioriteettiryhmään. Meidän on luotava oma. Miten se tehdään?

  • Luo etusijaryhmä nimeltään SquareSumOperatorPrecedence.
ensisijaisuusryhmä SquareSumOperatorPrecedence {
matalampi: Kerroinpainotus
korkeampiTensi: LisäysPrecedence
assosiatiivisuus: vasen
tehtävä: väärä
}

Täällä loimme prioriteettiryhmän, jonka etusija on korkeampi kuin AdditionPrecedence ja pienempi kuin MultiplicationPrecedence ja vasemman assosiatiivisuuden.

'Ei mitään', 'vasen' tai 'oikea' ovat assosiatiivisuuden mahdollisia arvoja.
Tehtävänmuokkain, joka toimii seuraavasti: Operaattorilla merkitty tehtävä taitetaan valinnaiseen ketjuun, jolloin foo? .bar) + = 2.
Tämä käyttäytyminen siirretään tehtäväksi: totta prioriteettiryhmissä.
  • Korvaa nyt ◉-operaattorin alkuperäinen ilmoitus:
infix-operaattori ◉: SquareSumOperatorPrecedence

Se siitä.

mukautettu infix-operaattori

Se siitä. !

Minne mennä täältä?

  • Lisätietoja operaattorien ylikuormituksesta. Luokat ja rakenteet voivat tarjota omat toteutuksensa olemassa oleville operaattoreille. Tätä kutsutaan olemassa olevien operaattoreiden ylikuormitukseksi. Esimerkki: ==, + jne.
Esimerkki omenapohjoista
  • Lisätietoja yleisten tyyppirajoitusten lisäämisestä mukautettuihin operaattoreihin

Nauttia!!

Jos nautit tämän viestin lukemisesta, jaa ja anna joitain clapppeja, jotta muut löytävät sen !!!!

Voit seurata minua Mediumissa tuoreiden artikkeleiden löytämiseksi. Ota yhteyttä minuun myös LinkedInissä ja Twitterissä.

Jos sinulla on kommentteja, kysymyksiä tai suosituksia, voit lähettää ne alla olevaan kommenttiosaan!