【问题标题】:Storing an enum property inside CoreData and making it convenient在 CoreData 中存储枚举属性并使其方便
【发布时间】:2012-04-19 10:39:13
【问题描述】:

我的一个模型对象有一个枚举属性。为了将它存储在 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 core-data enums typedef nsnumber


    【解决方案1】:

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

    编辑

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

    【讨论】:

    • 酷,我不知道这个。不幸的是,我正在开发的应用程序必须支持 iOS 4,至少还要再过几个月。
    猜你喜欢
    • 2011-03-28
    • 2015-01-10
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多