Хранение свойства enum внутри CoreData и удобство его использования

Один из моих объектов модели имеет свойство перечисления. Чтобы сохранить его в 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?

person Dirty Henry    schedule 05.04.2012    source источник


Ответы (1)


CoreData в iOS 5 поддерживает нативные целые типы, так что вы можете использовать их вместо NSNumber, если хотите.

ИЗМЕНИТЬ

FWIW, компилятор может сделать перечисление настолько маленьким, насколько это необходимо для возможных значений, которые оно содержит. Лучше всего приводить перечисление -- (int)myEnumValue -- при назначении в NSNumber, потому что предполагается, что тип имеет точный размер, который вы ему сообщаете.

person Jody Hagins    schedule 18.05.2012
comment
Круто, я этого не знал. К сожалению, приложения, над которыми я работаю, должны поддерживать iOS 4, по крайней мере, еще пару месяцев. - person Dirty Henry; 18.05.2012