2012-04-05 11 views
5

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?

Respuesta

0

CoreData en iOS 5 admite tipos enteros nativos, por lo que puede usar eso en lugar de NSNumber si lo desea.

EDITAR

Fwiw, el compilador puede hacer que la enumeración sea tan pequeña como sea necesario para los posibles valores que contiene. Es mejor emitir la enumeración - (int) myEnumValue - cuando se asigna a un NSNumber, porque asume que el tipo es el tamaño exacto que le indica.

+0

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

Cuestiones relacionadas