Swift presta una gran atención a la limpieza de la sintaxis y permite crear operadores personalizados (sobrecarga de operadores), incluidos nuevos símbolos e incluso palabras clave. Esto amplía las capacidades de DSL y permite que el código sea muy expresivo.
Sin entender los principios de declaración de operadores, se puede obtener código ambiguo, difícil de leer y mantener. Una prioridad o asociatividad mal elegida llevará a resultados inesperados. El compilador permite crear expresiones bastante "peligrosas" si no se especifican restricciones.
Se pueden declarar nuevos operadores infix, prefix, postfix, especificar sus prioridades y ámbitos de aplicación. Ejemplo:
infix operator ~> : AdditionPrecedence func ~> (lhs: Int, rhs: Int) -> Int { return lhs * 10 + rhs } let x = 2 ~> 3 // 23
Para prioridades personalizadas, se debe declarar:
precedencegroup MyPrecedence { associativity: left higherThan: AdditionPrecedence } infix operator *** : MyPrecedence
Características clave:
¿Es obligatorio implementar tanto la función como la declaración del operador?
Sí, si se declara un operador, se debe implementar la función correspondiente; de lo contrario, habrá un error de compilación. Las funciones tienen una firma que coincide con el operador en cuanto a la firma.
¿Cómo elegir correctamente el precedencegroup y cómo influyen los grupos en el orden de los cálculos?
El precedencegroup establece la prioridad de cálculo y la asociatividad para los operadores infix. Una elección incorrecta del grupo puede llevar a resultados inesperados en expresiones con múltiples operadores (por ejemplo, multiplicación/suma y su operador personalizado).
¿Se puede declarar un operador personalizado con un nombre textual?
No, los operadores personalizados están disponibles solo a través de símbolos especiales o secuencias definidas por la sintaxis de Swift. Los nombres estándar de texto no están permitidos para ser declarados como operadores.
En el proyecto se declararon operadores <<< y >>> para transformaciones extrañas de colecciones, sin descripción de prioridad, asociatividad y documentación. Los nuevos empleados no entendían qué hacían ni en qué orden se evaluaban las expresiones.
Ventajas:
Desventajas:
En el proyecto se utilizó un operador personalizado => para una construcción declarativa de un pipeline encadenable (por ejemplo, en un constructor de UI), con una prioridad claramente definida y una implementación documentada. Cada desarrollador entendía qué estaba haciendo y cómo se utilizaba.
Ventajas:
Desventajas: