恩纳姆与NSnumber

时间:2013-06-23 16:57:15

标签: objective-c c enums

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

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

enum {
  ERROR,
  INCOMPLETE,
  OK
} EventStatus;

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

而且只是:

[muObjectOnCoredata setStatus: INCOMPLETE];

我认为应该可以,因为我可以将枚举声明为NSInteger,但它对我来说仍然不好

感谢您的帮助

3 个答案:

答案 0 :(得分:18)

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

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

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

或者在NSManagedObject的子类中添加一个方法,使用enum EventStatus创建一个数字并调用原始方法

答案 1 :(得分:12)

将托管对象的状态命名为statusNumber

然后

@dynamic statusNumber


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

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

只需将转化隐藏到您的实施中。

答案 2 :(得分:0)

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

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