Один из моих объектов модели имеет свойство перечисления. Чтобы сохранить его в CoreData, я использовал объект NSNumber.
Тем не менее, я хотел бы получить доступ к нему как к типу enum удобным способом. Какова наилучшая практика для достижения этого?
До сих пор я использовал следующий код.
в 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;
в 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];
}
}
Мои вопросы:
- Что-то не так в коде выше?
- Является ли тип
int
правильным для использования при преобразовании перечисления в NSNumber? (NSNumber не предоставляет метод-(enum)enumValue;
) - Не могли бы вы оставить аспект проверки для проверки модели CoreData во время выполнения?
- [НОВОЕ] Как я могу объяснить другим разработчикам, что следует использовать удобное свойство, а не свойство NSNumber?