使用Core Data实现Enums的最佳方式

Mic*_*ord 108 iphone cocoa cocoa-touch core-data objective-c

将Core Data实体绑定到枚举值的最佳方法是什么,以便我能够为实体分配类型属性?换句话说,我有一个Item带有itemType属性的实体,我希望将其绑定到枚举,实现此目的的最佳方法是什么.

iKe*_*dac 130

如果要将值限制为枚举,则必须创建自定义访问器.所以,首先你要声明一个枚举,如下:

typedef enum {
    kPaymentFrequencyOneOff = 0,
    kPaymentFrequencyYearly = 1,
    kPaymentFrequencyMonthly = 2,
    kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Run Code Online (Sandbox Code Playgroud)

然后,为您的财产声明getter和setter.覆盖现有的是一个坏主意,因为标准访问器期望NSNumber对象而不是标量类型,如果绑定或KVO系统中的任何内容尝试访问您的值,您将遇到麻烦.

- (PaymentFrequency)itemTypeRaw {
    return (PaymentFrequency)[[self itemType] intValue];
}

- (void)setItemTypeRaw:(PaymentFrequency)type {
    [self setItemType:[NSNumber numberWithInt:type]];
}
Run Code Online (Sandbox Code Playgroud)

最后,您应该实现,+ keyPathsForValuesAffecting<Key>以便在itemType更改时获取itemTypeRaw的KVO通知.

+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
    return [NSSet setWithObject:@"itemType"];
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 太糟糕的Core Data本身不支持这个.我的意思是:Xcode生成类文件,为什么不`enum`s? (2认同)
  • 使用Xcode 4.5,您不需要任何此类操作.看看我的回答.你只需要将枚举定义为`int16_t`然后你就可以了. (2认同)

Dan*_*ert 79

你可以这样做,方式更简单:

typedef enum Types_e : int16_t {
    TypeA = 0,
    TypeB = 1,
} Types_t;

@property (nonatomic) Types_t itemType;
Run Code Online (Sandbox Code Playgroud)

在您的模型中,设置itemType为16位数.全部完成.无需其他代码.只需按照惯例

@dynamic itemType;
Run Code Online (Sandbox Code Playgroud)

如果您使用Xcode创建NSManagedObject子类,请确保选中" 使用原始数据类型的标量属性 "设置.

  • 每次重新生成模型类时,如何避免丢失此代码?我一直在使用类别,以便可以重新生成核心域实体. (6认同)
  • 这应该是公认的答案.更简单! (6认同)
  • 不,这与C++ 11无关.它是clang 3.3的一部分,支持**ObjC的固定底层类型**的枚举.Cf http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features (4认同)
  • @Rob Categories是一种方法,但你也可以使用mogenerator:https://github.com/rentzsch/mogenerator.Mogenerator将为每个实体生成2个类,其中一个类将始终覆盖数据模型更改,而其他子类则用于自定义内容,并且永远不会被覆盖. (3认同)
  • `retain`与内存管理有关,**不是**是否存储到数据库中. (2认同)
  • 我同意罗布.我不希望这个必须一遍又一遍地重生.我更喜欢这个类别. (2认同)
  • 肯定看起来像C++与所有下划线 (2认同)

Mik*_*lah 22

我正在考虑的另一种方法是不要声明枚举,而是在NSNumber上将值声明为类别方法.

  • 这是一个例子:http://renovatioboy.wordpress.com/2011/10/06/super-useful-nsnumberenum-category/ (6认同)

jfl*_*fla 5

如果您正在使用mogenerator,请查看:https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types.您可以使用名为的Integer 16属性itemType,其attributeValueScalarType值为Item用户信息.然后,在实体的用户信息中,设置为定义枚举additionalHeaderFileName的标题的名称Item.生成头文件时,mogenerator将自动使属性具有Item类型.