ProgrammatieMiddle iOS ontwikkelaar

Hoe werken operatorfuncties (operatoroverloading als functies) in Swift? Wat zijn de beperkingen bij overbelastingen en is het mogelijk om eigen operators te maken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Operators kunnen alleen worden overbelast voor eigen types of combinaties van standaard- en eigen types.
  • Het creëren van eigen operators kan alleen met symbolen die in Swift zijn toegestaan voor operators (+*-/&|^%~!=<>.?).
  • Misbruik het creëren van nieuwe operators niet om de leesbaarheid van de code niet te verminderen.

Vragend met een haakje.

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 }

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


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.