Operator overloading is de mogelijkheid om het gedrag van standaard (en eigen) operatoren te definiëren of te vervangen voor gebruikerspecifieke types. Dit maakt de notatie van operaties met jouw structuren en klassen expressiever.
Kenmerken:
static func met de vereiste modificator operator in de globale scope.Equatable, Comparable, enz.).infix, prefix, postfix) maken door de bijbehorende sleutelwoorden op te geven.Voorbeeld:
struct Vector2D { var x: Double var y: Double static func +(lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } } let a = Vector2D(x: 1, y: 2) let b = Vector2D(x: 3, y: 4) let sum = a + b // Vector2D(x: 4, y: 6)
Nuances:
ExpressibleByBooleanLiteral, BooleanType).precedence group) opgeven voor nieuwe operatoren.Is het mogelijk om standaard operatoren zoals + te overbelasten voor objecten van klassen, en wat is nodig om jouw eigen structuren te vergelijken via ==?
Antwoord: Ja, standaard operatoren (bijvoorbeeld +, ==, <) kunnen worden overbelast voor gebruikerspecifieke structuren en klassen. Voor het vergelijken van structuren/klassen met == moet het type voldoen aan het Equatable protocol en een statische functie voor gelijkheid implementeren:
Voorbeeld:
struct Point: Equatable { let x: Int let y: Int static func ==(lhs: Point, rhs: Point) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } }
Verhaal
De operator == werd overbelast voor een structuur, maar hash(into:) werd niet geïmplementeerd, terwijl dit type als sleutel in een Set of woordenboek werd gebruikt. Dit leidde ertoe dat gelijke elementen dubbel in de verzameling kwamen of niet werden gevonden, omdat het standaardmechanisme Hashable was verbroken.
Verhaal
Een eigen infix-operator werd gemaakt zonder een precedence group op te geven. De operator werkte onverwacht volgens onlogische associativiteitsregels, wat leidde tot fouten bij complexe expressies.
Verhaal
In het project werd de operator | geïntroduceerd voor het samenvoegen van modellen, echter, nieuwkomers verwarden deze vaak met de bitwise OR-operatie, waardoor er verwarring en onjuiste verwerking van gegevens ontstond bij de eenvoudige controle van booleaanse vlaggen.