Consejo rápido Enumeraciones en Swift

Las enumeraciones son un patrón de diseño común en muchos lenguajes de programación. Si bien puede estar familiarizado con las enumeraciones en C y en Objective-C, la implementación de las enumeraciones de Swift es significativamente más poderosa y flexible. En esta sugerencia rápida, aprenderá qué tienen de especial las enumeraciones en Swift, cómo usarlas en sus proyectos y qué las hace tan poderosas..

1. ¿Qué es una enumeración??

Las enumeraciones no son nuevas y ciertamente no son exclusivas de Swift. Sin embargo, si estás familiarizado con las enumeraciones en C, entonces te encantará la poderosa toma de enumeraciones de Swift..

Si las enumeraciones o las enumeraciones son nuevas para usted, es posible que no esté familiarizado con lo que tienen para ofrecer. En Swift, las enumeraciones son tipos de primera clase que definen una lista de valores posibles para ese tipo.

Un ejemplo podría ser los posibles estados de una conexión de red. Los estados posibles podrían ser:

  • desconectado
  • conectando
  • conectado

Podríamos agregar un cuarto estado para el caso de que el estado sea desconocido. Con este ejemplo en mente, veamos cómo definir e implementar tal enumeración.

Lo esencial

Como dije, las enumeraciones son tipos de primera clase en Swift. Una definición de enumeración es muy similar a una definición de clase o estructura. En el siguiente ejemplo, definimos la Estado de conexión enumeración.

enumeración Estado de conexión 

El nombre de la enumeración va precedido por el enumerar palabra clave y seguido de un par de llaves. los Estado de conexión La enumeración definirá los posibles estados de una conexión de red. Para definir estos estados, sumamos valores de los miembros o miembros a la definición de la enumeración. La definición de un valor miembro siempre comienza con la caso palabra clave.

enum ConnectionState caso Caso desconocido Caso desconectado Caso de conexión Conectado

En C o en Objective-C, la enumeración anterior se vería un poco diferente, como se ilustra en el siguiente ejemplo. Cada valor de la enumeración se corresponde con un entero, por ejemplo, Estado de conexión desconocido es igual a 0, Estado de conexión desconectado es igual a 1, etc.

typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;

Esto no es cierto en Swift. Los miembros de una enumeración no se corresponden automáticamente con un valor entero. Los miembros de la Estado de conexión La enumeración son valores en sí mismos y son de tipo. Estado de conexión. Esto hace que trabajar con enumeraciones sea más seguro y más explícito..

Valores en bruto

Es posible especificar explícitamente los valores de los miembros de una enumeración. En el siguiente ejemplo, los miembros de la Estado de conexión La enumeración tiene un valor bruto de tipo En t. A cada miembro se le asigna un valor bruto, correspondiente a un entero.

enum ConnectionState: Int caso Desconocido = -1 caso Desconectado = 0 caso Conectando = 1 caso Conectado = 2

Tenga en cuenta que especificamos el tipo de los valores sin procesar en la definición de la enumeración y que ningún valor de dos miembros puede tener el mismo valor sin procesar. Si solo especificamos un valor para el Desconocido miembro, entonces Swift incrementará automáticamente el valor del Desconocido miembro y asignar valores únicos a los otros miembros de la enumeración. Para ilustrar mejor esto, el siguiente ejemplo es idéntico a la definición anterior de Estado de conexión enumeración.

enum ConnectionState: Int caso Desconocido = -1 caso Desconectado caso Conectando caso Conectado

2. Trabajar con enumeraciones

Inicialización

Utilizando la Estado de conexión La enumeración es similar a usar cualquier otro tipo en Swift. En el siguiente ejemplo, declaramos una variable., estado de conexión, y establece su valor en ConnectionState.Connecting.

var connectionState = ConnectionState.Connecting

El valor de estado de conexión es ConnectionState.Connecting y la variable es de tipo Estado de conexión.

La inferencia de tipos de Swift es muy conveniente cuando se trabaja con enumeraciones. Porque declaramos estado de conexión como de tipo Estado de conexión, Ahora podemos asignar un nuevo valor usando la sintaxis de puntos abreviada para las enumeraciones.

connectionState = .Connected

Flujo de control

Usando enumeraciones en una Sicambiar La declaración es sencilla. Recuérdalo cambiar Las declaraciones deben ser exhaustivas. Agrega un defecto caso si es necesario.

enum ConnectionState caso Desconocido caso Desconectado Conectar caso Conectado var connectionState = ConnectionState.Connecting connectionState = .Conectado switch connectionState Caso. Desconectado: println ("Desconectado") caso .Conectando: println ("Conectando") caso. Conectado: println ("Conectado") predeterminado: println ("Estado desconocido")

El siguiente ejemplo demuestra cómo Estado de conexión enum se puede utilizar. También muestra cómo acceder al valor asociado de un miembro de enumeración. los canConnect función acepta un Estado de conexión instancia y devuelve un Bool.

func canConnect (connectionState: ConnectionState) -> Bool var result = false switch connectionState case .Connected (let port): if port == 3000 result = true default: result = false return result let state = ConnectionState. Conectado (3000) si canConnect (estado) //…

los canConnect la función solo devuelve cierto Si el Estado de conexión instancia pasada a la función es igual a .Conectado y su valor asociado es una En t igual a 3000. Tenga en cuenta que el valor asociado de la Conectado miembro está disponible en el cambiar declaración como una constante nombrada Puerto, que luego podemos utilizar en el correspondiente caso.

3. Valores asociados

Otra característica convincente de las enumeraciones de Swift son los valores asociados. Cada miembro de una enumeración puede tener un valor asociado. Los valores asociados son muy flexibles. Por ejemplo, los valores asociados de diferentes miembros de la misma enumeración no necesitan ser del mismo tipo. Eche un vistazo al siguiente ejemplo para comprender mejor el concepto de valores asociados.

enum ConnectionState caso Caso desconocido Caso desconectado Caso de conexión (Int, Double) Caso de conexión (Int)

los Desconocido y Desconectado Los miembros no tienen un valor asociado. losConectando miembro tiene un valor asociado de tipo (Int, Doble), especificando el número de puerto y el intervalo de tiempo de espera de la conexión. los Conectado miembro tiene un valor asociado de tipo En t, especificando el número de puerto.

Es importante entender que un valor asociado está vinculado o asociado a un miembro de la enumeración. El valor del miembro se mantiene sin cambios. El siguiente ejemplo ilustra cómo crear un Estado de conexión instancia con un valor asociado.

var connectionState = ConnectionState.Connecting (3000, 30.0)

4. Métodos y tipos de valor

Métodos

Las enumeraciones son bastante poderosas en Swift. Las enumeraciones pueden incluso definir métodos, como un inicializador para seleccionar un valor de miembro predeterminado si no se especificó.

enum ConnectionState caso Caso desconocido Caso desconectado Caso de conexión (Int, doble) Caso de Connected (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown

En este ejemplo, inicializamos una instancia de Estado de conexión enumeración sin especificar explícitamente un valor para ello. Sin embargo, en el inicializador de la enumeración, establecemos la instancia en Desconocido. El resultado es que el estado de conexión variable es igual a ConnectionState.Unknown.

Tipos de valor

Al igual que las estructuras, las enumeraciones son tipos de valor, lo que significa que una enumeración no se pasa por referencia, como las instancias de clase, sino por valor. El siguiente ejemplo lo ilustra.

var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unknown

A pesar de que asignamos connectionState1 a connectionState2, los valores de connectionState1 y connectionState2 Son diferentes al final del ejemplo..

Cuando connectionState1 se asigna a connectionState2, Swift crea una copia de connectionState1 y le asigna eso a connectionState2. En otras palabras, connectionState1connectionState2 referirse a dos diferentes Estado de conexión instancias.

Conclusión

Las enumeraciones en Swift son increíblemente poderosas en comparación con, por ejemplo, las enumeraciones en C. Uno de los aspectos más poderosos de las enumeraciones es que son tipos de primera clase en Swift. La seguridad de tipos es un aspecto clave del lenguaje Swift y las enumeraciones encajan perfectamente en esa mentalidad.