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..
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:
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.
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..
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
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
Usando enumeraciones en una Si
o cambiar
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
.
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)
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
.
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, connectionState1
y connectionState2
referirse a dos diferentes Estado de conexión
instancias.
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.