Operator overloading — это возможность определения или переопределения поведения стандартных (и собственных) операторов для пользовательских типов. Это позволяет сделать запись операций с вашими структурами и классами более выразительной.
Особенности:
static func с обязательным модификатором operator в глобальном скоупе.Equatable, Comparable и др.).infix, prefix, postfix), указывая их при помощи соответствующих ключевых слов.Пример:
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)
Нюансы:
ExpressibleByBooleanLiteral, BooleanType).precedence group) для новых операторов.Можно ли перегружать стандартные операторы, такие как +, для работы с объектами классов, и что нужно для реализации сравнения ваших собственных структур через ==?
Ответ: Да, стандартные операторы (например, +, ==, <) могут быть перегружены для пользовательских структур и классов. Для сравнения структур/классов через ==, тип должен соответствовать протоколу Equatable и реализовывать статическую функцию equality:
Пример:
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 } }
История
Переопределили оператор == для структуры, но не реализовали hash(into:), при этом использовали этот тип в качестве ключа в Set или словаре. В результате одинаковые элементы попадали в множество дважды или не находились, так как стандартный механизм Hashable был нарушен.
История
Создали собственный infix-оператор без задания precedence group. Оператор неожиданно работал по нелогичным правилам ассоциативности, приводя к ошибкам при сложных выражениях.
История
В проекте ввели оператор | для слияния моделей, однако новички часто путали его с битовой операцией OR, из-за чего возникала путаница и неправильная обработка данных в лёгкой проверке булевых флагов.