¿Cuál es la diferencia entre [code] optionset [/ code] y [code] enums [/ code] en Swift?

Un conjunto de opciones es un conjunto, es decir, es una disposición de una o más opciones combinadas. Una enumeración solo tiene un valor, que se “selecciona” de varios valores. (Por supuesto, cuando está asignando la enumeración o el conjunto de opciones, ambos se definen como una disposición de múltiples opciones).

Aquí hay una cita de Ole Begemann:

Swift importa esta definición no como una enumeración, sino como una estructura que se ajusta al protocolo OptionSet . ¿Por qué una estructura y no una enumeración? Las enumeraciones son excelentes cuando los casos son mutuamente excluyentes , es decir, solo se puede establecer una opción a la vez. Pero no puede combinar varios casos de enumeración en un solo valor en Swift, a diferencia de C, donde el compilador trata una enumeración como un número entero y puede asumir cualquier valor.

Se establece claramente que un conjunto de opciones es una estructura que se ajusta al protocolo OptionSet y puede asumir múltiples valores combinados. Las enumeraciones son “mutuamente excluyentes”: solo puede elegir una opción.

Leer más: Conjuntos de opciones en Swift

OptionSet es un protocolo que tiene un propósito específico.

Hace muchos años, en mis días de programación en C, tenía un byte con cada bit en el byte que representaba una opción particular y, si estaba configurado, la opción estaba activada.

Esto es particularmente eficiente porque obtienes 8 opciones en un byte. En la actualidad, el tamaño de las palabras es mayor, pero puede usar la misma técnica. Cuando define un conjunto de opciones, está definiendo los bits en una palabra. Si mira la documentación de Apple, puede ver que están configurando los bits. La sintaxis 1 << 3 significa desplazamiento 1 tres bits a la izquierda.

struct ShippingOptions: OptionSet {
let rawValue: Int
static let nextDay = ShippingOptions (rawValue: 1 << 0)
static let secondDay = ShippingOptions (rawValue: 1 << 1)
static let prioridad = ShippingOptions (rawValue: 1 << 2)
static let standard = ShippingOptions (rawValue: 1 << 3)

static let express: ShippingOptions = [.nextDay, .secondDay]
static dejar que todos: ShippingOptions = [.express, .priority, .standard]
}

Lo que agrega este protocolo que es adicional a esa técnica es definirlo como un conjunto. Esto es particularmente útil, porque todo lo que desea hacer con tal construcción es verificar si ciertas opciones están configuradas o no . Debido a que es un conjunto, la sintaxis es clara cuando está probando esto. (En C, verificaría la posición de bit individual, que no está clara y si accidentalmente obtuve la posición de bit incorrecta, catastrófica). De nuevo, de la documentación de Apple:

dejar de comprarPrecio = 87.55
var freeOptions: ShippingOptions = []
si compraPrecio> 50 {
freeOptions.insert (.priority)
}
if freeOptions.contains (.priority) {
print (“¡Has obtenido envío prioritario gratis!”)
} más {
print (“¡Agregue más a su carrito para envío prioritario gratis!”)
}
// Imprime “¡Has ganado envío prioritario gratis!”

Puede ver lo fácil que son usar para múltiples opciones y, sin embargo, son eficientes porque se almacenan como bits en una palabra.