5

我的模型对象之一具有枚举属性。要将其存储在 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];
    }
}

我的问题是:

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

1 回答 1

0

iOS 5 中的 CoreData 支持本机整数类型,因此您可以根据需要使用它而不是 NSNumber。

编辑

FWIW,编译器可以使 enum 对于它所持有的可能值尽可能小。最好在分配到 NSNumber 时强制转换 enum -- (int)myEnumValue --,因为它假定类型是您告诉它的确切大小。

于 2012-05-18T02:20:46.680 回答