Uno de mis objetos modelo tiene una propiedad enum. Para almacenarlo en CoreData, he usado un objeto NSNumber.Almacenar una propiedad enum dentro de CoreData y hacerla conveniente
Sin embargo, me gustaría acceder a él como un tipo de enumeración de manera conveniente. ¿Cuál es la mejor práctica para lograr eso?
Hasta ahora, he ido con el siguiente código.
en MyObject.h
typedef enum _ABType {
ABTypeUnknown,
ABTypeValue1,
...
ABTypeValueN
} ABType;
@interface MyObject : NSManagedObject
@property (nonatomic, retain) NSNumber * myPersistentEnum; // Defined in my Core Data model
@property (nonatomic) ABType myConvenientEnum;
en MyObject.m
@dynamic myPersistentEnum;
- (BOOL)isValidEnumValue {
if (self.myPersistentEnum) {
int intValue = [self.type intValue];
if (intValue >= ABTypeValue1 && intValue <= ABTypeValueN) {
return YES;
}
}
ELog(@"Undefined enumValue %@", self.myPersistentEnum);
return NO;
}
- (ABType)myConvenientEnum {
if ([self isValidEnumValue]) {
return [self.type intValue];
}
return ABTypeUnknown;
}
- (void)setMyConvenientEnum:(ABType)enumValue {
NSNumber *oldValue = [self.myPersistentEnum retain];
self.myPersistentEnum = [NSNumber numberWithInt:enumValue];
if ([self isValidEnumValue]) {
[oldValue release];
} else {
self.myPersistentEnum = oldValue;
[oldValue release];
}
}
Mis preguntas son:
- ¿Hay algo malo en el código anterior?
- ¿Es
int
el tipo correcto para usar al convertir una enumeración a NSNumber? (NSNumber no proporciona un método-(enum)enumValue;
) - ¿Dejaría el aspecto de validación en la validación del modelo CoreData en tiempo de ejecución?
- [NUEVO] ¿Cómo puedo dejar en claro para otros desarrolladores que se debe usar la propiedad conveniente y no la propiedad NSNumber?
Genial, no sabía esto. Lamentablemente, las aplicaciones en las que estoy trabajando deben ser compatibles con iOS 4, al menos durante un par de meses más. –