Tendrá que crear descriptores de acceso personalizados si desea restringir los valores a una enumeración. Entonces, primero declararías una enumeración, así:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Luego, declare getters y setters para su propiedad. Es una mala idea anular los existentes, ya que los accesores estándar esperan un objeto NSNumber en lugar de un tipo escalar, y tendrá problemas si algo en los enlaces o sistemas KVO intenta acceder a su valor.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Finalmente, debe implementarlo + keyPathsForValuesAffecting<Key>
para obtener notificaciones KVO para itemTypeRaw cuando cambia itemType.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
s?int16_t
y listo.Puedes hacerlo de esta manera, mucho más simple:
Y en su modelo, establezca
itemType
un número de 16 bits. Todo listo. No se necesita código adicional. Solo pon tu habitualSi está utilizando Xcode para crear su
NSManagedObject
subclase, asegúrese de que la configuración " usar propiedades escalares para tipos de datos primitivos " esté marcada.fuente
retain
tiene que ver con la gestión de memoria, no si se almacena en la base de datos o no.Un enfoque alternativo que estoy considerando es no declarar una enumeración en absoluto, sino declarar los valores como métodos de categoría en NSNumber.
fuente
Si está utilizando mogenerator, eche un vistazo a esto: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Puede tener un atributo Integer 16 llamado
itemType
, con unattributeValueScalarType
valor deItem
en la información del usuario. Luego, en la información de usuario de su entidad, establezcaadditionalHeaderFileName
el nombre del encabezado en el queItem
se define la enumeración. Al generar sus archivos de encabezado, mogenerator automáticamente hará que la propiedad tenga elItem
tipo.fuente
Configuré el tipo de atributo como un entero de 16 bits y luego uso esto:
...
fuente
Dado que las enumeraciones están respaldadas por un corto estándar, tampoco podría usar el contenedor NSNumber y establecer la propiedad directamente como un valor escalar. Asegúrese de establecer el tipo de datos en el modelo de datos principal como "Integer 32".
MyEntity.h
En otra parte del código
O analizar desde una cadena JSON o cargar desde un archivo
fuente
He hecho esto mucho y encuentro útil el siguiente formulario:
En este caso, la enumeración es bastante simple:
y lo llamo pedante, pero uso enumeraciones para los nombres de campo, como este:
Dado que esto puede resultar laborioso para modelos de datos complejos, escribí un generador de código que consume las entidades MOM / para escupir todas las asignaciones. Mis entradas terminan siendo un diccionario desde Tabla / Fila hasta tipo Enum. Mientras estaba en eso, también generé código de serialización JSON. He hecho esto para modelos muy complejos y ha resultado ser un gran ahorro de tiempo.
fuente
El código pegado a continuación funciona para mí y lo agregué como ejemplo de trabajo completo. Me gustaría escuchar opiniones sobre este enfoque, ya que planeo usarlo ampliamente en todas mis aplicaciones.
Dejé @dynamic en su lugar, ya que luego lo satisface el getter / setter nombrado en la propiedad.
Según la respuesta de iKenndac, no he anulado los nombres predeterminados de getter / setter.
He incluido una verificación de rango a través de un NSAssert en los valores válidos de typedef.
También agregué un método para obtener un valor de cadena para el typedef dado.
Prefijo constantes con "c" en lugar de "k". Conozco el razonamiento detrás de "k" (orígenes matemáticos, histórico), pero se siente como si estuviera leyendo código de ESL con él, así que uso "c". Es solo una cosa personal.
Aquí hay una pregunta similar: typedef como tipo de datos Core
Agradecería cualquier aportación sobre este enfoque.
fuente
Solución para clases generadas automáticamente
del Generador de código de Xcode (ios 10 y superior)
Si crea una entidad llamada "YourClass", Xcode automáticamente elegirá "Definición de clase" como tipo de Codegen predeterminado en "Inspector de modelo de datos". esto generará clases a continuación:
Versión rápida:
Versión Objective-C:
Elegiremos "Categoría / Extensión" de la opción Codegen en lugar de "Definición de clase" en Xcode.
Ahora, si queremos agregar una enumeración, cree otra extensión para su clase generada automáticamente y agregue sus definiciones de enumeración aquí como se muestra a continuación:
Ahora, puede crear descriptores de acceso personalizados si desea restringir los valores a una enumeración. Compruebe la respuesta aceptada por el propietario de la pregunta . O puede convertir sus enumeraciones mientras las configura con el método de conversión explícitamente utilizando el operador de conversión como se muestra a continuación:
También comprobar
Generación automática de subclase Xcode
fuente