2012-04-05 16 views
5

Jeden z moich obiektów modelu ma właściwość wyliczenia. Aby przechowywać go w CoreData, użyłem obiektu NSNumber.Przechowywanie właściwości wyliczeniowej wewnątrz CoreData i wygodnej jej obsługi.

Niemniej jednak chciałbym uzyskać do niego wygodny dostęp w formie wyliczeniowej. Jaka jest najlepsza praktyka, aby to osiągnąć?

Do tej pory użyłem następującego kodu.

w 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; 

w 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]; 
    } 
} 

moje pytania są następujące:

  • Czy jest coś złego w powyższym kodzie?
  • Czy odpowiedni typ to int przy konwersji wyliczenia do NSNumber? (Numer NSNumber nie udostępnia metody -(enum)enumValue;). Czy można zostawić aspekt sprawdzania poprawności dla sprawdzania poprawności modelu CoreData w czasie wykonywania?
  • [NEW] W jaki sposób mogę wyjaśnić innym programistom, że powinna być używana wygodna właściwość, a nie właściwość NSNumber?

Odpowiedz

0

CoreData w iOS 5 obsługuje natywne typy całkowite, więc możesz użyć tego zamiast NSNumber, jeśli chcesz.

EDIT

FWIW, kompilator może uczynić enum być tak mały, jak to konieczne do możliwych wartości posiadanych. Najlepiej jest rzucić enum - (int) myEnumValue - podczas przypisywania do NSNumber, ponieważ zakłada, że ​​typ jest dokładnie taki, jaki mu podajesz.

+0

Fajnie, nie wiedziałem tego. Niestety aplikacje, nad którymi pracuję, muszą obsługiwać iOS 4, przynajmniej przez kolejne kilka miesięcy. –

Powiązane problemy