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

Dir*_*nry 5 enums typedef core-data nsnumber ios

我的一个模型对象有一个枚举属性.为了将它存储在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;
Run Code Online (Sandbox Code Playgroud)

在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];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 上面的代码有什么问题吗?
  • int将枚举转换为NSNumber时使用的是正确的类型吗?(NSNumber没有提供-(enum)enumValue;方法)
  • 您是否将验证方面留给运行时CoreData模型验证?
  • [新]如何让其他开发人员明白应该使用方便的属性而不是NSNumber属性?

Jod*_*ins 0

iOS 5 中的 CoreData 支持原生整数类型,因此如果需要,您可以使用它来代替 NSNumber。

编辑

FWIW,编译器可以使枚举尽可能小,以满足其可能保存的值。当分配给 NSNumber 时,最好将枚举(int)myEnumValue 强制转换,因为它假定类型是您告诉它的确切大小。