Operator functions в Swift – это возможность реализовать или переопределить стандартные операторы (+, -, *, ==, < и т.д.), а также создавать собственные операторы (например, %% или <|>). Для этого используют ключевое слово operator в объявлении функции. Как правило, перегружают операторы для работы со своими типами, чтобы сделать их синтаксически удобными и интуитивными.
Пример перегрузки сложения для структуры 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)
Ограничения:
+*-/&|^%~!=<>.?).Можно ли перегрузить оператор для стандартных типов, например, чтобы изменить смысл работы + для Int?
Ответ: Нет, в Swift нельзя переопределять глобальное поведение операторов для стандартных типов, только расширять их для своих типов или специфических комбинаций. Например:
// Ошибка: перегрузка для Int не изменит существующую семантику+ func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // Не сработает: конфликт с существующим поведением }
История
На проекте был создан свой оператор ** (степень), который по невнимательности включал неправильный приоритет, что приводило к ошибочному вычислению выражений вроде 2 + 3 ** 2. Итог: неверные результаты, сложный для отладки баг.
История
В модуле с внутренним API перегрузили == для собственного типа, но не реализовали хэширование (Hashable), что привело к некорректной работе коллекций Set и Dictionary, где экземпляры считались разными при логическом равенстве.
История
При создании собственного оператора пользователи забыли задокументировать его смысл. Новый разработчик неверно понял семантику оператора и применил его к неподходящим данным, что вызвало трудноуловимые логические ошибки в бизнес-логике.