Przeciążanie operatorów to możliwość definiowania lub nadpisywania zachowania standardowych (i własnych) operatorów dla typów użytkownika. Umożliwia to uczynienie zapisu operacji z twoimi strukturami i klasami bardziej wyrazistym.
Cechy:
static func z obowiązkowym modyfikatorem operator w globalnym zasięgu.Equatable, Comparable itp.).infix, prefix, postfix), wskazując je za pomocą odpowiednich słów kluczowych.Przykład:
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)
Niuanse:
ExpressibleByBooleanLiteral, BooleanType).precedence group) dla nowych operatorów.Czy można przeciążyć standardowe operatory, takie jak +, do pracy z obiektami klas, i co jest potrzebne do implementacji porównania własnych struktur przez ==?
Odpowiedź: Tak, standardowe operatory (np. +, ==, <) mogą być przeciążane dla struktur i klas użytkownika. Aby porównywać struktury/klasy przez ==, typ musi odpowiadać protokołowi Equatable i implementować statyczną funkcję equality:
Przykład:
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 } }
Historia
Przeciążono operator == dla struktury, ale nie zaimplementowano hash(into:), przy tym używając tego typu jako klucza w Set lub słowniku. W rezultacie te same elementy trafiały do zbioru dwukrotnie lub nie były znajdowane, ponieważ standardowy mechanizm Hashable został naruszony.
Historia
Utworzono własny operator infix bez określenia precedence group. Operator działał niespodziewanie na nielogicznych zasadach asocjacyjności, prowadząc do błędów w złożonych wyrażeniach.
Historia
W projekcie wprowadzono operator | do łączenia modeli, jednak nowicjusze często mylili go z bitową operacją OR, co prowadziło do zamieszania i błędnego przetwarzania danych w prostym sprawdzaniu flag boole'a.