Operadores

Tutorial Swift – Operadores

Josué V. Herrera Swift Básico, Tutoriales 0 Comments

Hoy aprenderemos sobre los operadores que tenemos a nuestra disposición: los operadores lógicos, los operadores relacionales, los operadores aritméticos, etc. Es bien importante conocer esos matices que todo lenguaje tiene y que en muchas ocaciones los diferencia.

No quiero verme inmerso en algo tan aburrido como explicar el uso del operador + (suma) el cual asumo ya todos conozcan. Así que nos enfocaremos en aspectos más importantes / prácticos de los operadores en el lenguaje de programación Swift.

Operador de Asignación

El operador es posiblemente de los más conocidos y por ende más sencillos de explicar:

… y es que es sencillamente eso, es el operador (=) mediante el cual informamos al compilador que cierta posición de memoria asociada a una constante o variable le asignaremos cierto valor literal o el que almacena una constante como en el ejemplo anterior.

Operadores Aritméticos

Los operadores aritméticos son ese otro grupo que todos conocemos a través de las clases de matemáticas y que en la programación también usamos para expresar operaciones:

En este ejemplo hemos calculado el área de un circulo cuyo radio es de 8 unidades, nos apoyamos en pi siguiendo la formula (a = rπ²) y al final mostramos el resultado. En este ejemplo hemos usado nuevamente el operador de asignación y también el operador de multiplicación en la línea 17, sin olvidar que hemos extendido el dato Decimal. El objetivo de extender un objeto o tipo de dato es para añadir una funcionalidad que no posee, en este caso hemos agregado la capacidad perdida en Swift 3 de convertir un valor de Decimal a Double. Espero que no se sientan intimidados por el código y menos se amilanen, es un pequeño spoiler de todo lo que nos espera en futuros artículos donde abordaremos las extensiones y ya todo lucirá con más sentido.

La salida en pantalla del código anterior sería:

El resto de operadores aritméticos son:

Operadores AritméticosDescripción
+Suma dos números.
Resta dos números.
*Multiplica dos números.
/Divide dos números.
& El resto de una división.

Operadores Relacionales

Los operadores relacionales o de comparación son aquellos que nos sirven a la hora de comparar si un número es mayor o menor que otro, si es mayor o igual o menor o igual, si es igual o desigual que otro valor e incluso podemos verificar si dos instancias de una misma clase son iguales o diferentes:

Operadores RelacionalesDescripción
<Evalúa si el número de la izquierda es más pequeño que el número a la derecha.
<=Evalúa si el número de la izquierda es más pequeño o igual al número a la derecha.
>Evalúa si el número de la izquierda es mayor al número a la derecha.
>=Evalúa si el número de la izquierda es mayor o igual al número a la derecha.
==Evalúa si el número de la izquierda es igual al número a la derecha.
!=Evalúa si el número de la izquierda no es igual al número a la derecha.
===Evalúa si ambas instancias apuntan a la misma referencia.
!==Evalúa si ambas instancias no apuntan a la misma referencia.

Los operadores relacionales también son considerados operadores lógicos, en este artículo los hemos separado con el único objetivo de segmentar las funcionalidades y queden así más claras las diferencias.

Operadores Lógicos

Las operaciones de Álgebra de Boole se efectúan también mediante los operadores lógicos siguientes:

Operadores LógicosDescripción
&&AND Lógico: verdadero solo si ambos son verdaderos, falso en caso contrario.
||OR Lógico: verdadero si alguno es verdadero, falso solamente si ambos son falsos.
!NOT Lógico: si es verdadero se torna en falso y viseversa.

Con el operador NOT podemos crear expresiones simples como:

En las últimas dos líneas reside el enfoque del ejemplo, en la línea 12 imprimimos un texto en pantalla donde nos preguntamos si un valor es menos que cinco, pasamos ese valor como parámetro a la función que hemos declarado de la línea 6 a la 10 y de nombre lessThanFive. Esta función la primera ves que la ejecutamos pues devuelve verdadero ya que en efecto 2 es menor que cinco o lo que sería lo mismo la expresión 2 < 5 es igual a true. Similar sucede con la línea 14 pero con la diferencia de que hemos usado el operador binario NOT sobre el resultado que nos devuelve la función, obteniendo el resultado inverso:

Ahora, en el caso de los operadores lógicos AND y OR en conjunción con los operadores relacionales podemos lograr expresiones más complejas donde evaluar más de una expresión a la vez. Veamos:

En las líneas 11, 17 y 23 hemos anidado varias expresiones en pos de lograr filtrar ciertos valores, la salida en pantalla:

…explica por si misma la lógica que estamos persiguiendo en nuestro código.

Operador Ternario

Aparte de estos tenemos también el operador ternario que por alguna razón que no entiendo muchas personas lo obvian y usan if-else en sentencias tan simples como la del siguiente ejemplo, sentencia donde sin dudas el operador ternario es una opción que más que elegante parece que fue pensada para ella:

…la salida en pantalla sería:

Luego de analizar el ejemplo podemos deducir que la sintaxis de este operador ternario sería:

<expresión de control> ? < verdadero> : <falso>

…la expresión de control es aquella que evaluaremos y en dependencia del resultado pues se ejecutará el primer bloque en caso de ser verdadera la expresión y el segundo en caso de ser falsa.

Operador de Desbordamiento

Este tema fue lo que motivo este tutorial, el operador de desbordamiento. Este viene a ayudarnos con las operaciones matemáticas que predeciblemente pudieran generar un overflow (desbordamiento de memoria). Sí, ya se que quizás me estarán reclamando que esto lo podemos controlar con una simple validación de datos. Bueno, ciertamente es así y de hecho quizás esta sea la razón por lo que es tan poco conocido. No obstante creo que como forma parte del lenguaje y no sabemos si en algún momento nos encontramos con situaciones donde una validación no es viable, puede que este operador nos salve el día, aquí tienen un ejemplo:

…creen que estas líneas son correctas? Pues la primera sí, pero la segunda genera un error y el motivo es el siguiente: La variable y es de tipo Int8 por lo que el compilador asume que la expresión y + 10 debe de ser Int8, esto a su vez deviene en inferir que el tipo de z es Int8 también. El problema reside en que el resultado sería 130 y el tipo de dato Int8 solamente puede almacenar valor en el rango de -128 a 127, lógicamente 130 excede el valor máximo positivo que la variable z puede aceptar.

Una posible solución sería hacer uso del operador de desbordamiento y en especifico aquel acorde a la operación matemática qe estemos efectuando, en este caso sería &+, si fuera una resta pues &-, una multiplicación &* y así. El ejemplo anterior quedaría:

…y el resultado almacenado en z sería -126 ya que el compilador de Swift al darse cuenta de que el número se pasa de 127, en este ejemplo por tres unidades, cuando el valor sobrepasa por una unidad se conmuta la suma al número negativo más pequeño y que es -128 y a partir de aquí se le siguen sumando el resto de unidades que en este punto solamente quedarían dos y -128 + 2 = -126.

De manera similar funcionaría con una resta y el operador &-, veamos el siguiente ejemplo:

…aquí el valor de z es 126 positivo, la resta ha excedido  el valor mínimo de -128 en dos unidades ya que el resultado aritmético sería -130, entonces:

-130 – (-128) = -130 + 128 = -2

…la primera de estas unidades restantes activa el overflow y para que el programa no se detenga pues el operador de desbordamiento conmuta la resta al número máximo positivo que es 127, en este punto ya solamente quedaría una unidad restante por lo que 127 – 1 = 126.

Para finalizar y a modo de aclaración, en la línea de más arriba donde expongo la sintaxis del operador ternario, la he encerrado entre <> debido a que cada uno de esos campos son mandatory (obligatorios), en caso de ser opcionales hubiera usado [], este estándar será el usado por defecto.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!