Swift hecht traditioneel veel waarde aan de netheid van de syntaxis en stelt je in staat om je eigen operators te creëren (operator overloading), inclusief nieuwe symbolen en zelfs sleutelwoorden. Dit vergroot de mogelijkheden van DSL en maakt de code zeer expressief.
Zonder begrip van de principes achter het declareren van operators, kan de code ambigu, moeilijk leesbaar en moeilijk te onderhouden worden. Een verkeerd gekozen prioriteit of associativiteit kan leiden tot onverwachte resultaten. De compiler staat het creëren van vrij "gevaarlijke" uitdrukkingen toe als er geen beperkingen worden opgegeven.
Je kunt nieuwe infix, prefix, postfix operators declareren, hun prioriteiten en toepassingsgebieden aangeven. Voorbeeld:
infix operator ~> : AdditionPrecedence func ~> (lhs: Int, rhs: Int) -> Int { return lhs * 10 + rhs } let x = 2 ~> 3 // 23
Voor aangepaste prioriteiten moet je declareren:
precedencegroup MyPrecedence { associativity: left higherThan: AdditionPrecedence } infix operator *** : MyPrecedence
Belangrijke kenmerken:
Is het noodzakelijk om zowel de functie als de operator te implementeren?
Ja, als je een operator hebt gedeclareerd, moet je de bijbehorende functie implementeren - anders krijg je een compileerfout. Functies hebben een handtekening die overeenkomt met de operator qua handtekening.
Hoe kies je de juiste precedencegroup en hoe beïnvloeden groepen de volgorde van berekeningen?
precedencegroup stelt de prioriteit van de berekening en de associativiteit voor infix-operators in. Een verkeerde keuze van groep kan leiden tot onverwachte resultaten in uitdrukkingen met meerdere operators (bijvoorbeeld vermenigvuldiging/som en jouw custom-operator).
Kan je een custom operator met een tekstuele naam declareren?
Nee, custom operators zijn alleen beschikbaar via speciale symbolen of reeksen die door de Swift-syntaxis zijn gedefinieerd. Tekstuele standaardnamen zijn niet toegestaan voor declaratie als operator.
In het project werden de operators <<< en >>> gedeclareerd voor vreemde conversies van collecties, zonder het beschrijven van prioriteit, associativiteit en documentatie. Nieuwe medewerkers begrepen niet wat ze deden en in welke volgorde de uitdrukkingen werden berekend.
Voordelen:
Nadelen:
In het project werd de custom-operator => gebruikt voor declaratieve opbouw van een chainable pipeline (bijvoorbeeld in een UI builder), met een duidelijk beschreven prioriteit en gedocumenteerde implementatie. Elke ontwikkelaar begreep wat hij deed en hoe het werd gebruikt.
Voordelen:
Nadelen: