Las funciones de operadores en Swift son la posibilidad de implementar o redefinir operadores estándar (+, -, *, ==, <, etc.), así como crear operadores personalizados (por ejemplo, %% o <|>). Para ello se utiliza la palabra clave operator en la declaración de la función. Generalmente, se sobrecargan operadores para trabajar con sus propios tipos, para hacerlos sintácticamente convenientes e intuitivos.
Ejemplo de sobrecarga de suma para la estructura 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)
Limitaciones:
+*-/&|^%~!=<>.?).¿Se puede sobrecargar un operador para tipos estándar, por ejemplo, para cambiar el significado de + para Int?
Respuesta: No, en Swift no se puede redefinir el comportamiento global de los operadores para tipos estándar, solo se puede extender para sus tipos o combinaciones específicas. Por ejemplo:
// Error: sobrecarga para Int no cambiará la semántica existente+ func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // No funcionará: conflicto con el comportamiento existente }
Historia
En un proyecto se creó un operador propio ** (potencia), que por descuido incluía una prioridad incorrecta, lo que conducía a errores en el cálculo de expresiones como 2 + 3 ** 2. Resultado: resultados incorrectos, un error difícil de depurar.
Historia
En un módulo con API interno, se sobrecargó == para un tipo propio, pero no se implementó el hashing (Hashable), lo que llevó a un funcionamiento incorrecto de colecciones Set y Dictionary, donde las instancias se consideraban diferentes en igualdad lógica.
Historia
Al crear un operador propio, los usuarios olvidaron documentar su significado. Un nuevo desarrollador malinterpretó la semántica del operador y lo aplicó a datos inapropiados, lo que provocó errores lógicos difíciles de detectar en la lógica empresarial.