Kuidas kiiresti luua kohandatud operaator (nt ~ = operaator) ?? -

Olen näinud, et arendajad kasutavad kohandatud operaatoreid, mis lisab koodile tähenduse ja vähendab toimingu tegemiseks vajaliku koodi hulka. Kohandatud operaatorite loomist ei soovitata. Kuid ikkagi saate, kui soovite !!

Õppisin kiiresti mustrite sobitamist ja mu silmad takerdusid spetsiaalse operaatori külge ~ =. Olen seda varem mustri sobitamiseks kasutanud, kuid ma ei teadnud, kuidas see töötab. Olen kasutanud ~ = operaatorit kontrollimaks, kas http-tõrge kuulub mõnda antud vahemikku (tahtsin kontrollida, kas viga on 4xx, va 401):

Mul polnud aimugi, mida see sisemiselt teeb. Samuti ei teadnud ma, et saame ka selliseid kohandatud operaatoreid luua. Niisiis, ma küsisin selle kohta google ja ta näitas mulle kõike, mida ma tahtsin.

Vaadake kiiresti mõnda sellist operaatorit: Määratleb Swift

Operaatorite tüübid

Kiire operaator jaguneb järgmisteks tüüpideks:

  • Infix - kasutatakse kahe väärtuse vahel (nt: + )
  • Prefiks - kasutatakse enne väärtust (nt:! )
  • Postfiks - kasutatakse pärast väärtust (nt: !)
  • Ternary - kaks sümbolit, mis on sisestatud kolme väärtuse vahele (nt: ? : ). Praegu ei saa me kohandatud kolmepoolseid operaatoreid luua. Swift ei luba arendajatel seda teha.

Kuidas luua kohandatud operaatoreid?

Loome kohandatud operaatori numbri ruutjuure leidmiseks, kasutades sümbolit √.

Märkus. Ruutjuure leidmiseks on meil juba funktsioon sqrt () ja seda on lihtne kasutada. Mõelge sellele lihtsa näitena kohandatud operaatorite loomiseks.

Peaksime seda kasutama eesliiteoperaatorina, näiteks:

laske someVal = 25
lase squareRoot = √someVal // tulemus on 5

Arutleme selle loomise sammude üle.

  • Peame selle sümboli √ kuulutama prefiksi operaatoriks.
eesliite operaator √
  • Peame looma funktsiooni, mis võtab vastu ühe parameetri, ja tegema selle toimingu (ruutjuur).
eesliide func √ (lhs: Double) -> Double {
tagasi sqrt (lhs)
}

TEHTUD !! - - - palju õnne! Lõite just ruutjuure leidmiseks kohandatud prefiksi operaatori.

Kohandatud ruutjuure operaator kiiresti

Loome kohandatud infiksioperaatori, kasutades sümbolit ◉.

Operaatori funktsioon aktsepteerib kahte väärtust lhs ja rhs ning tagastab nende väärtuste ruutude summa. st; kui lhs on 2 ja rhs on 3, on tulemus 4 + 9. st; 13.

Kui mäletate neid samme,

  • Peame selle ◉ sümboli kuulutama infiksioperaatoriks.
infiksioperaator ◉
  • Peame looma funktsiooni, mis aktsepteerib kahte parameetrit, ja tegema ülalkirjeldatud toimingu.
infix func ◉ (lhs: Double, rhs: Double) -> Double {
tagasi lhs * lhs + rhs * rhs
}

Kui teete seda, karjub kompilaator teile järgmist: tõrge: MyPlayground.playground: 14: 1: tõrge: 'infix' modifikaatorit ei nõuta ega lubata funktsioonide deklaratsioonides.

Seega kirjutage funktsioon ümber, eemaldades infiksi märksõna.

 func ◉ (lhs: Double, rhs: Double) -> Double {
tagasi lhs * lhs + rhs * rhs
}

Palju õnne! Lõite just kohandatud infix-operaatori. Aga oota. Kas see on?

Küsimus: kas see on nii? Kas peame kohandatud operaatori loomisel arvestama millegi muuga?

Vastus: JAH !!! .. Peaaegu unustasin operaatori eelisõiguse, mille me koolis õppisime.

Leheküljed: Toimingute järjekord, Operaatori deklaratsioonid.

Matemaatikas ja enamikus arvutikeeltes antakse korrutamisele suurem tähtsus kui liitmisele. Seega tõlgendatakse avaldist 2 + 3 × 4 väärtusega 2 + (3 × 4) = 14, mitte (2 + 3) × 4 = 20. Peame ka kohandatud operaatori loomisel seda arvestama. Operaatorite tähtsus on oluline.

Eelistus ja seostatavus

Apple Docs'i link siin.

Operaatori ülimuslikkus annab mõnedele operaatoritele kõrgema prioriteedi kui teistele; neid operaatoreid rakendatakse esimesena.

Operaatori assotsiatiivsus määratleb, kuidas ühe ja sama prioriteedi operaatorid on rühmitatud - kas vasakult või paremalt. Mõelge sellele nii, et see tähendab „nad seostuvad väljendiga vasakul” või „nad seostatakse väljendiga paremal”.

Tüübid, millel on vasakpoolne assotsiatiivsus, sõelutakse nii, et v1 + v2 + v3 == (v1 + v2) + v3. Õige assotsiatiivsuse korral on vastupidine olukord.

Kui kuulutate uue operaatori ilma prioriteedirühma täpsustamata, kuulub see gruppi DefaultPrecedence. DefaultPrecedence ei seostu ning eelisjärjekord on vahetult kõrgem kui TernaryPrecedence.
Allikas: raywenderlich

Vaadake Apple'i dokumente, et saada kogu kasutatavate operaatorite nimekiri koos nende üksikasjadega.

Tulles tagasi meie ◉ infix-operaatori juurde, siis see ei sobi ühegi standardse tähtsusrühmaga. Peame looma oma. Kuidas seda teha?

  • Looge eelistusrühm nimega SquareSumOperatorPrecedence.
eelistusrühm SquareSumOperatorPrecedence {
lowerThan: korrutaminePretsessioon
betterThan: AdditionPrecedence
assotsiatiivsus: vasak
loovutamine: vale
}

Lõime siin eelistusrühma, mille prioriteetsus on kõrgem kui AdditionPrecedence ja madalam kui MultiplicationPrecedence ning vasakpoolne assotsiatiivsus.

„Puudub”, „vasak” või „parem” on assotsiatiivsuse võimalikud väärtused.
Ülesande modifikaator, mis töötab järgmiselt: operaatori märgistatud ülesanne volditakse valikuliseks ahelaks, lubades foo? .Bar + = 2-l töötada foo? -Na (. Bar + = 2), selle asemel et kontrollida tüüpi (foo? .bar) + = 2.
See käitumine kantakse üle määramisele: eelistusrühmades tõene.
  • Asendage oma operaatori esialgne deklaratsioon järgmisega:
infiksioperaator ◉: SquareSumOperatorPrecedence

See selleks.

kohandatud infiksioperaator

See selleks. !

Kuhu siit edasi minna?

  • Siit saate teada operaatorite ülekoormamise kohta. Klassid ja struktuurid võivad pakkuda olemasolevate operaatorite enda rakendusi. Seda nimetatakse olemasolevate operaatorite ülekoormamiseks. Nt: ==, + jne.
Näide õunadokumentidest
  • Lisateave üldiste tüübipiirangute lisamise kohta tavaoperaatoritele

Naudi !!

Kui teile meeldis seda postitust lugeda, siis palun jagage ja andke mõnele klappima, et teised leiaksid selle üles !!!!

Värskeid artikleid saate minust jälgida keskkonnas. Samuti saate minuga ühendust LinkedInis ja Twitteris.

Kui teil on kommentaare, küsimusi või soovitusi, postitage need julgelt allpool olevasse kommentaaride jaotisse!