Swift Enumeraciones

Una enumeración, en pocas palabras, es también un tipo de dato, solo que este tipo de dato contiene únicamente datos específicos definidos por el usuario; es un conjunto de datos con características comunes.

Las enumeraciones de Swift son similares a las estructuras de Objective C y C. Las funcionalidades de las enumeraciones son:

  • Se declaran dentro de una clase y se puede acceder a sus valores instanciando la clase.

  • Las enumeraciones también pueden definir constructores (initializers) para proporcionar un valor inicial a sus miembros; se puede extender su funcionalidad basándose en la implementación original.

  • Pueden adoptar protocolos (protocols) para proporcionar una funcionalidad estándar.

Sintaxis

En Swift se usa la palabra clave enum para crear enumeraciones y se coloca toda su definición entre llaves:

enum enumname {
   // 枚举定义放在这里
}

Por ejemplo, definimos la siguiente enumeración que representa los días de la semana:

import Cocoa

// 定义枚举
enum DaysofaWeek {
    case Sunday
    case Monday
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case Saturday
}

var weekDay = DaysofaWeek.THURSDAY
weekDay = .THURSDAY
switch weekDay
{
case .Sunday:
    print("星期天")
case .Monday:
    print("星期一")
case .TUESDAY:
    print("星期二")
case .WEDNESDAY:
    print("星期三")
case .THURSDAY:
    print("星期四")
case .FRIDAY:
    print("星期五")
case .Saturday:
    print("星期六")
}

El resultado de ejecutar el programa anterior es:

Jueves

Los valores definidos en la enumeración (comoSunday,Monday,……ySaturday) son losvalores miembros(omiembros)。caseLa palabra clave indica que se definirá un nuevo valor de miembro en la siguiente línea.

Nota: A diferencia de C y Objective-C, los miembros de una enumeración en Swift no reciben un valor entero predeterminado cuando se crean. En elDaysofaWeekejemplo anterior,Sunday,Monday,……ySaturdayno se le asigna implícitamente el valor0,1,……y6. Por el contrario, estos miembros de enumeración tienen por sí mismos valores completos, que son valores ya claramente definidos de tipoDaysofaWeektipo.

var weekDay = DaysofaWeek.THURSDAY 

weekDayEl tipo de ... puede, cuando esDaysofaWeekinicializado con uno de sus posibles valores, inferirse. Una vez queweekDayse declara como unDaysofaWeek, puedes usar una sintaxis abreviada (.) para asignarle otro valor deDaysofaWeekvalor:

var weekDay = .THURSDAY 

CuandoweekDayCuando el tipo es conocido, al asignarle un valor nuevamente se puede omitir el nombre de la enumeración. Usar valores de enumeración con tipo explícito hace que el código sea más legible.

Las enumeraciones se pueden dividir en valores asociados y valores primitivos.

Diferencia entre valores asociados y valores primitivos

Valores asociados Valores primitivos
Diferentes tipos de datos Mismo tipo de datos
Ejemplo: enum {10, 0.8, "Hello"} Ejemplo: enum {10, 35, 50}
Los valores se crean basados en constantes o variables Valores predefinidos
Un valor asociado se establece cuando creas una nueva constante o variable basada en un miembro de la enumeración, y cada vez que lo haces, su valor puede ser diferente. Los valores primitivos son siempre los mismos

Valores asociados

En el siguiente ejemplo definimos un tipo de enumeración llamado Student, que puede ser un String para Name, o un valor asociado (Int, Int, Int) para Mark.

import Cocoa

enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Ejemplo")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
    print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}

El resultado de ejecutar el programa anterior es:

学生的成绩是: 98,97,95.

Valores primitivos

Los valores primitivos pueden ser cadenas, caracteres, o cualquier valor entero o de coma flotante. Cada valor primitivo debe ser único dentro de la declaración de su enumeración.

Cuando los valores primitivos son enteros en una enumeración, no es necesario asignar explícitamente un valor a cada miembro; Swift lo hará automáticamente por ti.

Por ejemplo, cuando se usan enteros como valores primitivos, los valores asignados implícitamente se incrementan en 1 sucesivamente. Si el primer valor no se inicializa, se establecerá automáticamente en 0.

import Cocoa

enum Month: Int {
    case January = 1, February, March, April, May, June, July, August, September, October, November, December
}

let yearMonth = Month.May.rawValue
print("数字月份为: \(yearMonth)。")

El resultado de ejecutar el programa anterior es:

数字月份为: 5.
Otras extensiones