Enumeraciones en Swift

Enumeraciones es otro tema que quería tratar antes de continuar con la serie de tutoriales de Gorilla Rush.

Como seguramente saben de otros lenguajes de programación, una enumeración define un tipo común para un grupo de valores que están relacionados entre sí.

Sintaxis

La sintaxis para definir una enumeración es:

El siguiente ejemplo, muestra una enumeración que agrupa las posiciones en el campo de béisbol:

Como pudieron ver, se utiliza la palabra clave case para definir los valores de la enumeración, aunque de igual manera pueden colocar múltiples valores separados por coma en una misma línea como se muestra en el siguiente ejemplo, donde definimos una enumeración con los días de la semana:

En otros lenguajes de programación se les asigna a cada valor de la enumeración un valor entero, en Swift las enumeraciones son más flexibles ya que no tienes que obligatoriamente proporcionar un valor a los valores de la enumeración y si decides hacerlo, este valor puede ser una cadena, un caracter, entero o punto flotante; este valor en Swift se conoce como valor “raw”.

Es importante saber que en Swift no se asignan valores por defecto a los valores de una enumeración, por lo que en el ejemplo de DiasSemana, los valores Lunes, Martes, Miercoles, etc. no son implícitamente igual a 0, 1, 2, etc.

Podemos asignar un valor de una enumeración a una variable de la siguiente manera:

Luego de haber asignado un valor de una enumeración por prima vez a una variable, el tipo de esta variable ya es inferido, en este case sería DiasSemana, por lo que a partir de este momento se puede utilizar la sintaxis corta de punto para cambiar el valor de esta variable, por ejemplo:

Enumeraciones y Switch

Para utilizar un switch para comparar con el valor de una enumeración, puede hacerlo de la siguiente manera:

Teniendo en cuenta que anteriormente asignamos el valor .Domingo a la variable diaDeLaSemana, el código anterior debe imprimir “es domingon”.

Recuerden que en Swift, para el caso de los enumeradores, al ser utilizados con un switch, siempre por cada uno de los valores de la enumeración hay que implementar un caso del switch, si por algún motivo es conveniente no hacer esto, se puede utilizar la instrucción default del switch:

En el código anterior el flujo de programa se va a ir por el caso por defecto porque el valor de diaDeLaSemana es .Domingo.

Valores “raw”

Como mencioné anteriormente, en Swift los valores asociados por defecto a un valor de una enumeración pueden ser opcionales y no tienen que ser necesariamente de tipo entero y estos son conocidos como valores “raw”, veamos el siguiente ejemplo:

¿Notan las diferencias? esta enumeración representa algunos nombres de monedas y su código, el código es guardado como el valor raw de cada uno de los valores de la enumeración, este código es de tipo String por lo que es requerido especificarlo en la declaración de la enumeración (utilizando la misma sintaxis como cuando una clase va a heredar de otra); luego utilizando el signo de igual asignamos los valores raw a cada uno de los valores de la enumeración.

Nota: Existe una funcionalidad de las enumeraciones en Swift llamada valores asociados y tiene que ver con valores que puedes establecer cuando asignas un valor de una enumeración a una variable o constante, esto no es lo mismo que los valores raw ya que estos últimos son valores que se establecen en la definición de la enumeración.

Implícitamente…

En el caso de enumeraciones con valores raw de tipo enteros o cadenas, no es necesario establecer valores raw explícitamente ya que Swift lo hace por ti (bueno…, a menos que tu desees hacerlo por algún motivo de tu diseño).

En el caso de los enteros funciona igual que otros lenguajes de programación, como por ejemplo C#, donde al primer valor de la enumeración se le asigna 0 como valor raw (si usted explícitamente no le establece un valor), y el valor de los siguientes es uno más que el anterior. Veamos un ejemplo utilizando la enumeración Monedas:

En este ejemplo, Swift por defecto asigna 0 como valor raw a .DolarAmericano y el resto va tomando el valor del anterior más 1.

En las últimas dos líneas puede ver como se accede al valor raw, en el caso de la constante dolar sería 0 y en la constante peso sería 1.

Vamos a seguir utilizando este ejemplo pero vamos a modificarlo un poco:

En este caso, vemos como explícitamente decimos que el valor de .DolarAmericano es 1 por lo que ahora el resto de los valores serían 2, 3 y 4, tomando ahora la constante dolar el valor de 1 y la constante peso el valor de 2.

Veamos un ejemplo para el caso de los valores raw de tipo cadena:

Para los valores raw de tipo cadena (String), los valores raw implícitos de cada uno de los valores de la enumeración son el texto del nombre de cada valor de la enumeración; por ejemplo para .DolarAmericano sería “DolarAmericano”.

La constante peso tendría el valor “PesoCubano”.

Inicialización desde un valor raw

Si defines una enumeración que contiene un tipo de valor raw, esta enumeración tendrá un inicializador que contiene un parámetro llamado rawValue del mismo tipo de los valores raw; este inicializador devolverá el valor de la enumeración que coincida con el valor raw proporcionado a este inicializador, de no existir alguno simplemente devuelve nil, veamos un ejemplo utilizando la enumeración Monedas:

Esta versión de la enumeración Monedas se utilizan valores raw de tipo entero (Int), en la última línea pueden ver como utilizamos el inicializador que mencionamos anteriormente, en este ejemplo la constante moneda tendrá el valor .Yen que es el que coincide con el valor raw 3. Si en lugar de 3 hubiésemos pasado 5 el valor de moneda sería nil porque 5 no coincide con un valor raw válido para esta enumeración.

Hasta aquí lo que quería hablarles sobre las enumeraciones; hay algunas otras características de las enumeraciones como los valores asociados que ya mencionamos, entre otras, que pueden consultar en la documentación de Swift.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s