¿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.

More Interesting

¿Cómo puedo aumentar mi productividad para el desarrollo de iPhone?

Cómo convertirse en un desarrollador de iOS y Android desde cero

¿Qué lenguaje del lado del servidor debo aprender para complementar mis habilidades de desarrollo de iOS?

¿Cuáles son las mejores herramientas de creación para crear experiencias similares a revistas en el iPad?

Quiero crear una aplicación (iOS) que tenga videollamadas / transmisiones en vivo de igual a igual. ¿Cómo debo hacerlo? Sé que hay servicios, como Twilio, que me permiten hacer esto, pero ¿cómo aprenderé cómo usar el servicio? Tengo conocimientos básicos de Swift.

Cómo pasar datos de un controlador de vista a otro utilizando delegados en el objetivo c

¿Se puede incrustar una transmisión en vivo en una 'página' de una aplicación o necesita ser a pantalla completa?

¿Cómo aprenden sus desarrolladores los desarrolladores de plataformas Apple?

¿Cuáles son las mejores prácticas para sincronizar datos entre una aplicación iOS y una aplicación web?

¿Podré crear aplicaciones iOS básicas después de leer el libro Hacking with Swift de Paul Hudson?

¿Por qué las tecnologías de parches en caliente / implementación en caliente como JSPatch no son populares en las aplicaciones de iOS estadounidenses?

¿Quiénes son los mejores desarrolladores o firmas de iPhone disponibles para contratar?

¿Cuándo se llama al método textFieldShouldClear?

¿El objetivo C es más difícil que Python?

Móvil: ¿cuál es el mejor sistema para administrar notificaciones push entre varias aplicaciones?