Control de flujo de la aplicación usando estructuras condicionales en Swift

En Swift al igual que en otros lenguajes de programación la ejecución de un programa cambia según se vayan cumpliendo una serie de condiciones. Por esta razón todos los lenguajes de programación incluyen algún tipo de estructura condicional para poder controlar el flujo de ejecución de nuestro programa.

La mayoría de estructuras condicionales cumplen esta estructura:

Si se cumple una condición
entonces haz algo

Esto en Swift se consigue con la sentencia if y su sintáxis es la siguiente:


if condicionVerdadera {
// Codigo a ejecutar si se cumple la condicion
}

La condición siempre será una comparación booleana (devolverá verdadero o falso) y sólo se ejecutaría el código entre llaves si la comparación es verdadera.

Veamos un ejemplo sencillo.


/*
Playground de ejemplo de condicionales
*/
let num1 = 23
let num2 = 33

if num1 < num2 { print("Num1 es menor que num2") } if num1 > num2 {
print("Num1 es mayor que num2")
}
if num1 == num2 {
print("Num1 es igual que num2")
}

Comparaciones en Swift

La mayoría de comparaciones que se realizan en Swift son comparaciones de valores almacenados por variables u objetos. En Swift tenemos inicialmente las siguientes operaciones de comparación:

==
Igual a
!=
distinto de
<
Menor que
>
mayor que
<=
Menor o igual que
>=
mayor o igual que

Con este conjunto de comparaciones podemos resolver la mayoría de progremas de cualquier aplicación.

Ámbitos en Swift

En Swift el uso de las llaves ({ }) se utiliza para agrupar un trozo de código que pertenecerá a un mismo ámbito.

Los ámbitos no sólo se utilizan para determinar qué conjunto de órdenes pertenecen a una función, parte de código a ejecutar si se cumple una condición o qué funciones y propiedades pertenecen a una clase. Un ámbito también determina qué recursos están fuera y dentro del ámbito. Esto significa que podemos usar variables y constantes que estén por encima del ámbito pero todo aquello que declaremos dentro del ámbito no podrá ser utilizado fuera de él.

Veamos esto en un ejemplo de código.


/*
Playground de ejemplo de ambitos en Swift
*/

let numFuera = 3
do {
let numDentro = 5
print("fuera= \(numFuera) dentro = \(numDentro)")
}
print("fuera= \(numFuera) dentro = \(numDentro)")

Si intentamos ejecutar el código anterior obtendremos el siguiente error:

Playground execution failed:

error: PlayGroundTest.playground:4:38: error: use of unresolved identifier 'numDentro'
print("fuera= \(numFuera) dentro = \(numDentro)")
                                     ^~~~~~~~~

Esto se debe a que en la última línea de código, en el segundo uso de la función print() estamos haciendo referencia a la constante numDentro que está declarada dentro de un ámbito y esa función print() está siendo ejecutada fuera de ese ámbito.

Veremos más adelante más detalles de los ámbitos. Por ahora sólo nos interesa saber que las llaves nos permiten crear bloques de código agrupado y que los recursos creados y declarados dentro de un bloque son para ser utilizados dentro de ese bloque o dentro de los sub bloques que contenga.

Encadenando y anidando condicionales

Relacionada con la sentencia if tenemos la sentencia else que nos permite ejecutar un bloque de código si no se cumple la condición que estamos evaluando. Sería algo como:

Si se cumple una condición
  entonces haz algo
Si no 
  entonces haz otra cosa

Con la sintáxis de Swift el ejemplo sería el siguiente:


if condicionVerdadera {
// Codigo a ejecutar si se cumple la condicion
} else {
// Codigo a ejecutar si no se cumple la condicion
}

Un ejemplo práctico podría ser este:


/*
Playground de ejemplo de condicionales
*/
let num1 = 23
let num2 = 33

if num1 < num2 { print("Num1 es menor que num2") } else { print("Num1 no es menor que num2") }

Podemos encadenar varios else if para optimizar nuestro código. Nuestro ejemplo inicial quedaría de la siguiente forma:


/*
Playground de ejemplo de condicionales
*/
let num1 = 23
let num2 = 33

if num1 < num2 { print("Num1 es menor que num2") } else if num1 > num2 {
print("Num1 es mayor que num2")
}
else if num1 == num2 {
print("Num1 es igual que num2")
}

Además dentro de un dominio de una condición podemos incluir nuevas condiciones creando condiciones anidadas. Veamos un ejemplo práctico


/*
Playground de ejemplo de condicionales
*/
let num1 = 23
let num2 = 33

if num1 < num2 { if num1 == 23 { print("Num1 es menor que num2 y num1 tiene el valor 23") } else { print("Num1 es menor que num2") } } else { print("Num1 no es menor que num2") }

Realizando varias comparaciones a la vez

En algunas ocasiones puede que una condición consista en el resultado de varias comparaciones. Swift, al igual que otros lenguajes de programación nos permite conjuntar comparaciones para crear una condición compuesta.

Para poder crear estas uniones entre comparaciones tenemos las palabras AND y OR qe nos permiten crearr combinaciones más complejas. Pero en Swift en lugar de utilizar la palabra AND debemos usar el doble símbolo de ampersand (&&) y para la palabra OR debemos usar el doble símbolo de línea vertical (||).

Si utilizamos el AND indicamos que ambas comparaciones deben cumplirse para que la condición sea verdadera. Pero si utilizamos el OR sólo necesitamos que se cumpla una de las comparaciones para considerar que la condición se cumple.

Veamos un ejemplo de código


/*
Playground de ejemplo de condiciones compuestas
*/

let num1 = 10
let num2 = 20
var num3 = num2 / num1
var num4 = 2

if num1 < num2 && num3 == num4 { print("num1 es menor que num2 y num3 es igual que num4") } else { print("No se cumple la condición de num1 es menor que num2 y num3 es igual que num4") } // cambiamos el valor de num4 num4 = 4 if num1 < num2 && num3 == num4 { print("num1 es menor que num2 y num3 es igual que num4") } else { print("No se cumple la condición de num1 es menor que num2 y num3 es igual que num4") } // Cambiamos and por or if num1 < num2 || num3 == num4 { print("num1 es menor que num2 o num3 es igual que num4") } else { print("No se cumple la condición de num1 es menor que num2 o num3 es igual que num4") }

Al ejecutar este código obtendremos este resultado:

num1 es menor que num2 y num3 es igual que num4
No se cumple la condición de num1 es menor que num2 y num3 es igual que num4
num1 es menor que num2 o num3 es igual que num4

Conclusiones

En este artículo hemos aprendido lo siguiente:

  • Qué es un control de flujo
  • Qué es un ámbito en Swift
  • Cómo podemos comparar variables y valores
  • Cómo anidar y encadenar controles de flujo

El uso de los bloques de control de flujo son indispensables para poder crear aplicaciones que hagan algo más que mostrar valores por pantalla por lo que es muy importante dominar bien este aspecto de la programación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.