Como en cualquier otro lenguaje de programación, las enumeraciones nos permiten asociar una serie de etiquetas con valores constantes de tipo numérico; de modo que posteriormente podamos hacer referencia a dichas etiquetas en el código para que cobre así una mayor legibilidad y claridad.
Por ejemplo, cuando al cabo de los años volvamos a leer nuestro código (o este deba de ser leído por otra persona), tendrá mayor sentido si encontramos una comparación del tipo:
if estado = kStatus.OK
en comparación a si la comprobación se establece así:
if estado = 0
En este caso, ¿qué significa ese ‘0’, que ha ido todo bien o es justamente lo contrario?
Ahora bien, lo primero que se ha de tener en cuenta cuando se utilizan las enumeraciones en Xojo es que no se pueden tratar como si fuesen números enteros (Integer). De hecho, y como hemos visto en otras ocasiones, cuando se define una enumeración se está creando un nuevo tipo de dato y, por tanto, no se puede asignar un entero a una enumeración, y tampoco se puede asignar cualquiera de las constantes englobadas en una enumeración directamente a una variable de tipo entero, sino que habrá de hacerse un cast del valor. (Entre otras cuestiones del lenguaje, este es el tipo de temas que podrás encontrar explicadas al detalle en mi libro “Programación multiplataforma Xojo”.)
De acuerdo, entendido. ¿Y cómo creo una enumeración exactamente? Bien, el IDE de Xojo permite crear tantas enumeraciones como sean precisas a nivel general en un módulo, ventana o bien cualquiera de las clases creadas por nosotros o que sean derivadas de cualquiera de las ya existentes en el framework de Xojo. En todos los casos, cuando se añade un nuevo Enumerador desde el IDE se accede al mismo editor, mostrado en la siguiente imagen:
En la ventana Inspector ha de utilizarse el campo ‘Name’ para introducir el nombre que se desee asignar al nuevo tipo de dato. Sobre el valor seleccionado para el ámbito del enumerador, se aplica el tipo de visibilidad estándar que también se aplica a otros elementos del lenguaje, como ocurre por ejemplo con la propiedades y métodos (puedes profundizar sobre el ámbito —Scope— en el segundo capítulo “Programación multiplataforma Xojo”). En cuanto al tipo de dato (campo, ‘Type’) este siempre ha de ser Integer. No es posible crear enumeradores en los que se utilice otro tipo de dato en la asignación a cada una de las etiquetas.
Asignar valores en la definición de enumeradores Xojo
Y la explicación de que esto sea así es porque, por omisión, en la definición de un nuevo enumerador se irán asignando valores de forma incremental a cada una de las etiquetas o constantes, utilizando 0 como valor inicial. Ahora bien, eso no implica que siempre se haya de seguir este mismo patrón sino que en la mayoría de los casos probablemente se prefiera utilizar una asignación personalizada de valores para cada una de las etiquetas o campos del enumerador. Esto mismo es lo que se puede ver en el ejemplo utilizado aquí. Como se ve, en cada caso es posible asignar un valor distinto utilizando el operador de asignación estándar:
Eso sí, ha de tenerse en cuenta que Xojo no realiza (en el momento de escribir esto) ninguna comprobación sobre si se asigna un mismo valor a cualquiera de los campos del enumerador; algo que probablemente no sea el efecto buscado o deseado en la mayoría de los casos. También ha de tenerse en cuenta que el principio general de asignación con autoincremento se aplica al resto de los campos en los que no se asigne ningún valor, tomando como valor de referencia el último disponible:
De este modo, al campo ‘NuevoValor’ se le asignará el valor 3, dado que el campo que le precede tiene asignado el valor 2.
Acceso a los campos de Enumerador
Como en el resto de los principales elementos del lenguaje (objetos y módulos, por ejemplo), se utiliza la notación por punto para acceder a cada uno de los miembros del enumerador, empleando en todos los casos la nomenclatura completa cuando se realice desde un objeto diferente a aquél en el que se haya declarado. Así, si por ejemplo el enumerador ‘kStatus’ estuviese definido en el módulo ‘MiModulo’ se accedería al miembro ‘Error’ de la siguiente forma:
MiModulo.kStatus.Error
Mientras que si estuviese definido en la clase ‘MiClase’, se utilizaría:
MiClase.kStatus.Error
Y en el caso de que se utilice dentro de un método correspondiente a la clase ‘MiClase’:
kStatus.Error
Uso de Enumeradores Xojo en métodos
Pero más allá de aportar una mayor legibilidad al código, el uso de los enumeradores también proporcionan un mayor control sobre el paso de valores permitidos en los métodos, dado que éste ha de estar comprendido entre cualquiera de los miembros declarados por el enumerador. Obviamente el parámetro ha de estar definido en la signatura del método con el tipo correspondiente al enumerador. Por ejemplo, el método:
checkStatus( status as kStatus)
Aceptará los valores ‘kStatus.OK’ y ‘kStatus.Error’, rechazando el compilador cualquier otro valor arbitrario.
Conclusiones
Como se ha visto, los enumeradores son un gran aliado en la creación de nuestros programas. Confío que la próxima vez que te veas tentado a la hora de utilizar valores numéricos sin más como marcadores de estado (u otro tipo), o bien te sientas inclinado por la definición de diferentes constantes para este fin, pruebes a utilizar un enumerador.