在CoreData中存储枚举属性并使其变得方便



我的一个模型对象有一个enum属性。为了将其存储在CoreData中,我使用了一个NSNumber对象。

尽管如此,我还是希望以一种方便的方式将其作为枚举类型进行访问。实现这一目标的最佳实践是什么?

到目前为止,我已经使用了以下代码。

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

我的问题是:

  • 上面的代码有问题吗
  • 将枚举转换为NSNumber时,int是正确的类型吗?(NSNumber不提供-(enum)enumValue;方法)
  • 是否将验证方面留给运行时CoreData模型验证
  • [新增]我该如何向其他开发商明确表示,应该使用便利房地产,而不是NSNumber房地产

iOS 5中的CoreData支持本机整数类型,因此如果需要,可以使用该类型而不是NSNumber。

编辑

FWIW,编译器可以使枚举尽可能小,以容纳可能的值。在分配到NSNumber时,最好强制转换enum(int)myEnumValue,因为它假定类型与您告诉它的大小完全相同。

最新更新