我的模型对象之一具有枚举属性。为了将它存储在 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 属性?
最佳答案
iOS 5 中的 CoreData 支持原生整数类型,因此您可以根据需要使用它代替 NSNumber。
编辑
FWIW,编译器可以使 enum 尽可能小,因为它包含可能的值。最好在分配给 NSNumber 时转换枚举——(int)myEnumValue——因为它假定类型是你告诉它的确切大小。
关于ios - 在 CoreData 中存储枚举属性并使其方便,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032852/