Saltar al contenido
KodigoSwift

Tutorial Swift – La sentencia Switch

La Sentencia Switch

En este Tutorial Swift aprenderemos sobre la sentencia Switch, una estructura de control presente en la mayoría de los lenguajes de programación y que nos ayuda en la toma de decisiones múltiples.

Dedicamos este artículo por completo a una sentencia que quizás para algunos sea trivial, pero a mi parecer hay cierta tendencia al uso de if/else en lugar de switch, y es que cuando las condiciones que analizamos son unas pocas el uso de if/else sería el más aconsejado pero cuando ya tenemos cierta complejidad y número de condiciones switch sin dudas es la elección más sabia.

¿Cuál elegir?

Comenzaré con esta pregunta. Si nos encontramos en este punto, elegir if/else o switch, pues la respuesta correcta sería que esto depende del caso. Hay que tener en cuenta que la sentencia if/else ejecuta un código basado en si la expresión que está siendo evaluada es true o false, mientras que switch toma en consideración un valor en particular y va en busca de una coincidencia a través de los casos que le fueron especificados. Ciertamente lo que podemos hacer con if/else lo podemos lograr con switch pero no todo lo que podemos lograr con switch ni de cerca lo podemos hacer con la sentencia if/else. Nuevamente llegamos al punto ya recurrente, donde solamente sabremos a ciencia cierta cual elegir una vez que hayamos entendido las posibilidades que nos brinda cada sentencia, en este caso switch, pues if/else es sencilla en cuanto a formas y bastante bien dominada por todos.

Sintaxis

Un ejemplo de sintaxis sería:

…donde Value sería el valor que estaríamos buscando a través de los dos casos que estamos evaluando, someValueToCompare y anotherValueToCompare, donde ante el evento de una coincidencia con Value pues el código asociado a este caso se ejecutaría. Por último tenemos a default el cual forma parte de la sentencia switch y viene a ejecutarse siempre y cuando no se han encontrado coincidencias.

Uso

Veamos un ejemplo práctico de lo antes comentado:

…en este ejemplo nos hemos apoyado en switch para asociar un código de error con su respectiva descripción, en el ejemplo el caso cuyo código sería ejecutado es el 404.

Habría que notar también que al contrario de otros lenguajes de programación la sentencia switch en el lenguaje Swift no genera automáticamente una cascada hacia los casos siguientes, una vez que ha finalizado la ejecución del código correspondiente al caso cuya coincidencia fue afirmativa, el control de flujo sale automáticamente del bloque switch. Por este motivo es que en esos lenguajes para terminar la ejecución del bloque switch se usa la palabra clave de control de flujo break. Más adelante veremos como este efecto de cascada también lo podemos lograr en Swift.

Pero el anterior ejemplo puede ser optimizado, mejorado en términos generales y de paso vamos viendo las distintas formas que puede adoptar switch:

…la salida en pantalla sería:

Como podemos observar hemos reducido nuestra sentencia switch, nos encontramos analizando todos los valores que teníamos antes pero ahorita en un solo caso y cada valor separado por coma. Estos nos limita la posibilidad de dar una respuesta individual por cada código de error pero también es cierto que esto a la mayoría de los usuarios no les dice nada, por ende hemos abogado por una salida más amigable.

Como el código de error es el 404 y este se encuentra en nuestro caso pues es evidente que el código asociado a este se ejecutará, pero dentro de este, en la línea 15, tenemos una declaración de transferencia de control llamada fallthrough la cual nos viene a permitir modificar el orden de ejecución del control de flujo de nuestra sentencia switch. El flujo normal en este ejemplo hubiera sido salir de la sentencia switch hacia la línea 23 ya que el código del caso había sido ejecuto, rompiendo con esto la palabra clave fallthrough redirecciona el flujo al siguiente caso y va directamente a la ejecución de su código sin importar que coincida o no con el valor que se está evaluando (404).

Por el motivo antes comentado es que en la línea 19 hacemos uso del operador += y así concatenamos el valor asociado a la variable errorString en la línea 13 con el de esta, todo esto sin tener que duplicar código o implementar lógicas enrevesadas.

Rangos

Hasta ahora hemos visto casos donde se evalúa un solo valor y otros donde tenemos varios separados por coma. Pues switch también puede evaluar rangos haciendo uso de la sintaxis rangoX…rangoY y lo mejor de todo es que todos estos modos de evaluación pueden coexistir en un mismo bloque switch, mejor veamos un ejemplo:

…la salida en pantalla sería:

Aquí nos encontramos ante una nueva versión del ejemplo que hemos venido trabajando hasta ahora. Los primeros dos casos de las líneas 11 y 15 ya los habíamos analizado, a estos le siguen los de las líneas 19, 23 y 27 donde se evalúan rangos de valores continuos. La interpretación de estos rangos creo que es más que evidente, switch itera por este rango en búsqueda de una coincidencia. Imaginemos solamente que en lugar de un rango de 5 unidades tuviéramos uno de 12, cuan engorroso y visualmente feo sería y luciría una implementación así.

Enlace de valores

Dada una cierta necesidad particular más otros factores de diseño un bloque switch va a estar en la mente de un programador como apoyo a disimiles casos donde la versatilidad de esta sentencia se pondrá a prueba. Como sé que esto es una realidad aquí les traigo otra modificación del anterior ejemplo, con un nuevo matiz:

Este ejemplo es muy similar al otro, los cambios más significativos son el uso de la interpolación de valores en pos de que el mensaje contenga el código de error exacto, quizás en un supuesto modo debug donde esto pueda servir de ayuda a la hora de hacer Troubleshooting.

Lo curioso del ejemplo es el último caso, el cual viene a sustituir a default,  en este creamos una constante (pudo haber sido una variable) al vuelo, y cuando digo al vuelo quiero decir que su existencia y tiempo de vida estarán condicionados a que ninguna coincidencia haya resultado válida (por esto es que sustituye a default) y solamente podrá ser utilizada dentro del cuerpo de este caso como se puede constatar en la línea 33. Ahora veamos la salida en pantalla:

…aquí vemos como el valor de statusCode fue enlazado de manera automática con la constante que hemos creado en la línea 31.

La cláusula where

El progreso de nuestro ejemplo ha sido satisfactorio, y aunque funciona bien aun no carece de mejoras válidas. Veamos un último ejemplo antes de finalizar:

En esta ocasión hemos introducido la cláusula where en la línea  31, esta nos ayuda como una especie de filtro dinámico donde eliminamos valores que no deseamos comprender dentro de la constante unknownCode y por ende tampoco dentro de su cuerpo. Cuando hacemos esto ya este caso no se evaluará de la misma forma y lógicamente tampoco se ejecutará ante cualquier número como por ejemplo 50, caso donde se ejecutaría default. La salida en pantalla sería:

…una vez más default viene a hacerse cargo de los valores no contemplados.

Tras todos estos ejemplos y contrastando con lo que ya conocemos acerca de if/else podemos decir que switch está pensado para comparaciones donde existan un gran número de coincidencias potenciales y donde necesitamos flexibilidad en pos de sin mucha complejidad lograr el resultado deseado. Por otro lado y en contraste con switch, la sentencia if/else se debe usar ante eventos donde tengamos una o dos condiciones y es que aunque yo se que el uso de if/else es lo más común dada la cantidad de comparaciones simples que usualmente tenemos que hacer, desde mi punto de vista abusar de if/else encadenados o anidados penaliza mucho la legibilidad del código.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo mediante el formulario en el panel derecho y síguenos en nuestras redes sociales. Mantente así al tanto de todas nuestras publicaciones futuras.

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!

Entradas relacionadas

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!