4

如何创建包含 NSNumber 的枚举?我的应用程序中有一个 coredata 持久性,一个实体的状态属性在 coredata 中声明为整数 16,这意味着它是一个 NSNumber

我希望能够声明我的枚举以包含 NSNumber 而不是 int 所以我可以使用它们而不必写这个可怕的东西

enum {
  ERROR,
  INCOMPLETE,
  OK
} EventStatus;

[myObjectOnCoredata setStatus: [[NSNumber alloc] initWithInt:INCOMPLETE]];

并且只是:

[muObjectOnCoredata setStatus: INCOMPLETE];

我认为这应该是可能的,因为我可以将枚举声明为 NSInteger,但它仍然对我不利

谢谢你的帮助

4

3 回答 3

19

自去年 WWDC 以来,您可以使用盒装表达式来创建 NSNumber:

@(INCOMPLETE) // Equals to [NSNumber numberWithInt:INCOMPLETE]

另请参阅:http: //clang.llvm.org/docs/ObjectiveCLiterals.html
有一次它说它在任何 Apple 编译器中都不可用,但现在 Clang 是自 3.2 版以来支持此功能的默认编译器

或者您将一个方法添加到您的 NSManagedObject 的子类中,enum EventStatus该方法会创建一个数字并调用原始方法

于 2013-06-23T17:01:35.800 回答
13

将 managedObject 上的状态命名为statusNumber

然后

@dynamic statusNumber


- (void)setStatus:(EventStatus)status {
    self.statusNumber = [[NSNumber alloc] initWithInt:status]];
}

- (EventStatus)status {
    return [self.statusNumber intValue];
}

只需将转换隐藏到您的实现中即可。

于 2013-06-23T21:01:51.720 回答
0

枚举不能保存对象。只有整数类型。您可以使用 @ 或 @() 轻松地将值装箱,但请注意它是哪种整数类型,以便正确收件箱。它可以是任何有符号或无符号整数类型。未能正确拆箱可能会由于具有不同长度或符号的隐式转换而导致意外溢出。尽管许多枚举使用从零开始的默认隐式值,但这并不能保证。

因此,检查枚举定义并选择正确的 NSNumber 方法,例如 intValue for int。

于 2013-06-23T23:42:20.193 回答