我的一个模型对象有一个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,因为它假定类型与您告诉它的大小完全相同。