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?
Fajnie, nie wiedziałem tego. Niestety aplikacje, nad którymi pracuję, muszą obsługiwać iOS 4, przynajmniej przez kolejne kilka miesięcy. –