Operatorfuncties in Swift bieden de mogelijkheid om standaardoperators (+, -, *, ==, < enz.) te implementeren of te herdefiniëren, evenals het creëren van eigen operators (bijvoorbeeld, %% of <|>). Hiervoor gebruikt men het trefwoord operator bij de functieverklaring. Gewoonlijk worden operators overbelast voor het werken met eigen types, om ze syntactisch handig en intuïtief te maken.
Voorbeeld van het overbelasten van optelling voor de structuur Vector2D:
struct Vector2D { var x: Double var y: Double } func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } let v1 = Vector2D(x: 1, y: 2) let v2 = Vector2D(x: 3, y: 4) let sum = v1 + v2 // Vector2D(x: 4, y: 6)
Beperkingen:
+*-/&|^%~!=<>.?).Kan men een operator overbelasten voor standaardtypes, bijvoorbeeld om de betekenis van + voor Int te veranderen?
Antwoord: Nee, in Swift is het niet mogelijk om het globale gedrag van operators voor standaardtypes te herdefiniëren, alleen uit te breiden voor eigen types of specifieke combinaties. Bijvoorbeeld:
// Fout: overbelasting voor Int verandert de bestaande semantiek+ func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // Werkt niet: conflict met bestaand gedrag }
Verhaal
In een project werd een eigen operator ** (machtsverheffing) gemaakt, die per ongeluk een verkeerde prioriteit omvatte, waardoor foutieve berekeningen van uitdrukkingen zoals 2 + 3 ** 2 ontstonden. Resultaat: onjuiste resultaten en een moeilijk te debuggen bug.
Verhaal
In een module met een interne API werd == overbelast voor een eigen type, maar werd hashing (Hashable) niet geïmplementeerd, wat leidde tot onjuiste werking van verzamelingen Set en Dictionary, waar instanties als verschillend werden beschouwd bij logische gelijkheid.
Verhaal
Bij het creëren van een eigen operator vergaten gebruikers de betekenis ervan te documenteren. Een nieuwe ontwikkelaar begreep de semantiek van de operator verkeerd en paste deze toe op ongepaste gegevens, wat leidde tot moeilijk te traceren logische fouten in de bedrijfslogica.