¿Cómo crear un operador personalizado (como ~ = operador) en Swift? -

He visto desarrolladores que utilizan operadores personalizados que agregan significado al código y reducen la cantidad de código requerido para realizar una operación. No se recomienda crear operadores personalizados. ¡Pero aún puedes, si lo deseas!

Estaba aprendiendo sobre la coincidencia de patrones rápidamente y mis ojos se atascaron en un operador especial ~ =. Lo he usado antes para la coincidencia de patrones, pero no sabía cómo funciona. He utilizado el operador ~ = para verificar si el error http cae dentro del rango dado (quería verificar si el error es 4xx excluyendo 401) de esta manera:

No tenía idea de lo que hace internamente. Tampoco sabía que también podemos crear operadores personalizados como este. Entonces, le pregunté a Google sobre esto y él me mostró todo lo que quería.

Eche un vistazo a algunos de estos operadores en swift: define Swift

Tipos de operadores

Los operadores en Swift se dividen en los siguientes tipos:

  • Infijo: se utiliza entre dos valores (por ejemplo, + )
  • Prefijo: se usa antes de un valor (por ejemplo:! )
  • Postfix - Usado después de un valor (ej: !)
  • Ternario: dos símbolos insertados entre tres valores (por ejemplo, ? : ). No podemos crear operadores ternarios personalizados a partir de ahora. Swift no permitirá que los desarrolladores hagan esto.

¿Cómo crear operadores personalizados?

Creemos un operador personalizado para encontrar la raíz cuadrada de un número usando el símbolo √.

Nota: Ya tenemos la función sqrt () para encontrar la raíz cuadrada y es fácil de usar. Considere esto como un ejemplo simple para crear operadores personalizados.

Deberíamos usar esto como un operador de prefijo como:

deje someVal = 25
let squareRoot = √someVal // el resultado es 5

Analicemos los pasos para crear uno.

  • Necesitamos declarar este símbolo √ como operador de prefijo.
operador de prefijo √
  • Necesitamos crear una función que acepte un parámetro y realice la operación (raíz cuadrada).
prefijo func √ (lhs: Doble) -> Doble {
retorno sqrt (lhs)
}

¡¡HECHO!! - - - ¡Felicidades! Acaba de crear un operador de prefijo personalizado para encontrar la raíz cuadrada.

Operador de raíz cuadrada personalizado en Swift

Creemos un operador infijo personalizado usando el símbolo using.

La función de operador ◉ aceptará dos valores lhs y rhs y devolverá la suma de los cuadrados de estos valores. es decir; si lhs es 2 y rhs es 3, el resultado será 4 + 9. es decir; 13)

Si recuerdas los pasos,

  • Necesitamos declarar este símbolo ◉ como operador infijo.
operador infijo ◉
  • Necesitamos crear una función que acepte dos parámetros y realice la operación explicada anteriormente.
infix func ◉ (lhs: Double, rhs: Double) -> Double {
volver lhs * lhs + rhs * rhs
}

Si hace esto, el compilador le gritará diciendo: error: MyPlayground.playground: 14: 1: error: el modificador "infix" no es obligatorio ni está permitido en las declaraciones de funciones

Entonces, reescribe la función eliminando la palabra clave infix.

 func ◉ (lhs: Double, rhs: Double) -> Double {
volver lhs * lhs + rhs * rhs
}

Felicidades Acaba de crear un operador infijo personalizado. Pero espera. ¿Eso es todo?

Pregunta: ¿Eso es todo? ¿Tenemos que considerar algo más al crear un operador personalizado?

Respuesta: SI !!! .. Casi olvido la precedencia del operador que aprendimos en la escuela.

Consulte las páginas: Orden de operaciones, Declaraciones del operador.

En matemáticas y la mayoría de los lenguajes de computadora, a la multiplicación se le otorga una mayor prioridad que a la suma. Por lo tanto, se interpreta que la expresión 2 + 3 × 4 tiene el valor 2 + (3 × 4) = 14, no (2 + 3) × 4 = 20. Tendremos que considerar esto también al crear un operador personalizado. La precedencia de los operadores es un factor importante.

Precedencia y asociatividad

Apple Docs Link aquí.

La precedencia del operador otorga a algunos operadores mayor prioridad que otros; estos operadores se aplican primero.

La asociatividad de operadores define cómo se agrupan los operadores de la misma precedencia, ya sea agrupados desde la izquierda o agrupados desde la derecha. Piense que significa "se asocian con la expresión a su izquierda" o "se asocian con la expresión a su derecha".

Los tipos que tienen una asociatividad izquierda se analizan de modo que v1 + v2 + v3 == (v1 + v2) + v3. Lo contrario es cierto para la asociatividad correcta.

Si declara un nuevo operador sin especificar un grupo de precedencia, es un miembro del grupo de precedencia Predeterminación predeterminada. DefaultPrecedence no tiene asociatividad y tiene una precedencia inmediatamente superior a TernaryPrecedence.
Fuente: raywenderlich

Consulte los documentos de Apple para obtener la lista completa de operadores utilizados rápidamente con sus detalles.

Volviendo a nuestro operador ◉ infijo, no se ajusta a ninguno de los grupos de precedencia estándar. Tendremos que crear el nuestro. ¿Como hacer eso?

  • Cree un grupo de precedencia llamado SquareSumOperatorPrecedence.
precedencegroup SquareSumOperatorPrecedence {
lowerThan: MultiplicationPrecedence
superior a: Adición de antecedentes
asociatividad: izquierda
asignación: falso
}

Aquí, creamos un grupo de precedencia con una precedencia mayor que AdditionPrecedence y menor que MultiplicationPrecedence y asociatividad izquierda.

"Ninguno", "izquierda" o "derecha" son los posibles valores de asociatividad.
El modificador de asignación que funciona de la siguiente manera: una asignación marcada por el operador se pliega en una cadena opcional, lo que permite que foo? .Bar + = 2 funcione como foo? (.Bar + = 2) en lugar de no verificar el tipo como (foo? .bar) + = 2.
Este comportamiento se pasará a la asignación: verdadero en los grupos de precedencia.
  • Ahora reemplace su declaración original del operador ◉ con lo siguiente:
operador infijo ◉: SquareSumOperatorPrecedence

Eso es.

operador infijo personalizado

Eso es. !

A dónde ir desde aquí?

  • Aprenda sobre la sobrecarga de operadores. Las clases y estructuras pueden proporcionar sus propias implementaciones de operadores existentes. Esto se conoce como sobrecargar los operadores existentes. Ej: ==, + etc.
Ejemplo de documentos de apple
  • Obtenga más información sobre cómo agregar restricciones de tipo genérico a operadores personalizados

¡¡Disfrutar!!

Si disfrutaste leyendo esta publicación, comparte y da algunos aplausos para que otros puedan encontrarla !!!!

Puedes seguirme en Medium para artículos frescos. Además, conéctese conmigo en LinkedIn y Twitter.

Si tiene algún comentario, pregunta o recomendación, ¡no dude en publicarlos en la sección de comentarios a continuación!