Operatorüberladung ist die Möglichkeit, das Verhalten von Standard- (und benutzerdefinierten) Operatoren für benutzerdefinierte Typen zu definieren oder zu überschreiben. Dies ermöglicht eine ausdrucksvollere Schreibweise von Operationen mit Ihren Strukturen und Klassen.
Merkmale:
static func und dem obligatorischen Modifikator operator im globalen Scope definiert.Equatable, Comparable usw.) befolgt werden.infix, prefix, postfix) können erstellt werden, indem sie mit den entsprechenden Schlüsselwörtern angegeben werden.Beispiel:
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)
Nuancen:
ExpressibleByBooleanLiteral, BooleanType).precedence group) für neue Operatoren anzugeben.Kann man Standardoperatoren wie + überladen, um mit Objekten von Klassen zu arbeiten, und was ist notwendig, um den Vergleich Ihrer eigenen Strukturen über == zu implementieren?
Antwort: Ja, Standardoperatoren (zum Beispiel +, ==, <) können für benutzerdefinierte Strukturen und Klassen überladen werden. Für den Vergleich von Strukturen/Klassen über == muss der Typ dem Protokoll Equatable entsprechen und eine statische Funktion zur Gleichheit implementieren:
Beispiel:
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 } }
Geschichte
Der Operator == wurde für die Struktur überschrieben, aber hash(into:) wurde nicht implementiert, während dieser Typ als Schlüssel in Set oder Wörterbuch verwendet wurde. Infolgedessen wurden identische Elemente zweimal in die Menge eingefügt oder konnten nicht gefunden werden, da der Standardmechanismus Hashable gestört war.
Geschichte
Ein eigener Infix-Operator wurde erstellt, ohne eine precedence group anzugeben. Der Operator arbeitete unerwartet nach unlogischen Assoziationsregeln, was zu Fehlern bei komplexen Ausdrücken führte.
Geschichte
Im Projekt wurde der Operator | zur Zusammenführung von Modellen eingeführt, jedoch verwirrten ihn Neueinsteiger oft mit der bitweisen Operation OR, was zu Verwirrung und falscher Datenverarbeitung bei der einfachen Überprüfung von Booleschen Flags führte.