使用核心数据的枚举

Vin*_*nie 4 iphone core-data ios

处理帮助表的最佳方法是什么(我认为这是一个更具技术性的词,但它现在正在逃避我)?例如,我的名为Entity的对象具有entity_type属性.该entity_type需要一个字符串描述.我们假设只有少数entity_types可能.

所以我可以看到一些方法:

  1. 拥有另一个Core Data实体对象名称Entity_Type并将其连接到多个,以便我可以轻松获取描述.例如,这将允许我轻松地在UIPickerView中使用.

  2. 我还可以看到为什么#1是一个陷阱,因为稍后我需要做一些像switch/case这样的事情来处理每种类型的特定功能.作为一个核心数据对象,我没有说"id"来执行switch语句.替代方案是硬编码枚举,但那我将如何处理描述?

  3. 也许是两者的结合?

任何有类似情况的建议或经验都会有很大帮助.我试过搜索,但我所有出现的是如何找到CD对象的ID,这是无关紧要的.

Mik*_*ler 7

您所说的"组合"方法可能会像这样:

您的Entity_Type包含字符串描述和NSNumber'enumValue'属性.

然后定义一个具有显式值的枚举类型,用于向前和向后兼容(您不希望人们在顶部插入新枚举并破坏所有内容).

// these values must not change
enum Foo {
    FooType1 = 1,
    FooType2 = 2
};
Run Code Online (Sandbox Code Playgroud)

现在,您不希望将"enumValue"属性作为NSNumber处理,因此您不必使用@dynamic生成属性来定义自己的getter/setter来公开本机枚举值而不是NSNumber.像这样的东西:

- (void)setEnumValue:(enum Foo)newValue
{
    NSNumber *numberValue = [NSNumber numberWithInt:newValue];
    [self willChangeValueForKey:@"enumValue"];
    [self setPrimitiveValue:numberValue forKey:@"enumValue"];
    [self didChangeValueForKey:@"enumValue"];
}

- (enum Foo)enumValue
{
    [self willAccessValueForKey:@"enumValue"];
    NSNumber *numberValue = [self primitiveValueForKey:@"enumValue"];
    [self didAccessValueForKey:@"enumValue"];

    // optionally validate against possible enum values, maybe handle the case
    // when you are reading a database made by a later version which has new
    // unknown-to-us values, etc.
    return (enum Foo) [numberValue intValue]
}
Run Code Online (Sandbox Code Playgroud)

我已经从内存中编写了这段代码,但这是事情的一般要点.getter/setter与底层托管对象的NSNumber值进行通信,但是您的对象本身会将该属性公开为强类型枚举类型.

然后,您可以定义一些辅助方法来获取枚举值的关联实体.这应该只是一个带enumValue == %@谓词的简单获取请求.

您还必须小心处理未知的枚举值.较旧版本的软件最终可能会读取包含它不知道的新枚举值的数据库.