Objective c 带有NSnumber的枚举

Objective c 带有NSnumber的枚举,objective-c,c,enums,Objective C,C,Enums,如何创建包含NSNumber的枚举?? 我的应用程序中有一个coredata持久性,一个实体的状态属性在coredata中声明为整数16,这意味着它是一个NSNumber 我希望能够声明我的enum,以便包含NSNumber而不是int,这样我就可以使用它们,而不必编写这种糟糕的东西 enum { ERROR, INCOMPLETE, OK } EventStatus; [myObjectOnCoredata setStatus: [[NSNumber alloc] initWit

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

我希望能够声明我的enum,以便包含NSNumber而不是int,这样我就可以使用它们,而不必编写这种糟糕的东西

enum {
  ERROR,
  INCOMPLETE,
  OK
} EventStatus;

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

[muObjectOnCoredata setStatus: INCOMPLETE];
我认为这应该是可能的,因为我可以将enum声明为NSInteger,但它仍然对我不好


感谢您自去年WWDC以来提供的帮助,您可以使用装箱表达式创建NSNumber:

@(INCOMPLETE) // Equals to [NSNumber numberWithInt:INCOMPLETE]
另请参见此处:
在某一点上,它说它在任何苹果编译器中都不可用,但现在Clang是从3.2版开始支持它的默认编译器


或者,向NSManagedObject的子类添加一个方法,该方法使用
枚举EventStatus
,创建一个数字并调用原始方法

将managedObject上的状态命名为
statusNumber

然后


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

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


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

NSNumber
NSInteger
之间存在巨大差异
NSInteger
只是一个整数类型(typedef'd to
int
long
,具体取决于iOS上的系统-
int
),而
NSNumber
是一个对象(
NSNumber*
是它的指针以及如何使用它),这意味着它必须在运行时创建,因此不能像枚举那样是编译时常量。
#定义不完整[NSNumber numberwhithint:1]
@holex
#定义不完整@1
。它仍然是一个对象,应该与
isEqual
@Kevin进行比较,您是对的,显而易见的解决方案是为
status
属性创建适当的getter和setter。老实说,我本来会对这个问题投反对票(但我不会),因为“我太懒了,无法实现我想要的二传手或二传手。”@holex我不明白为什么要投反对票,实际上我没有想过要做一个二传手和二传手,希望我能宣布一个NSNumber enum在我看来更直截了当,现在我对这些类型有了更多的了解,我可以仔细选择了,最好创建一个setter和getter,在内部将enum转换为NSNumber。有时候,创建一个合适的setter和getter是比这更好的代码模式。但在其他情况下,这会有所帮助,例如,它不在对象中。例如,在我们的项目中,我需要将枚举保存在NSArray中,并且[array addObject:@(ConstantValue)];非常好。谢谢你!因为它只是一个枚举,而不是一个typedef,所以类型必须是
enum EventStatus
您还可以在导出
NSManagedObject
子类时选中“使用基本类型”,以便为动态属性自动实现这一点。
@dynamic statusNumber


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

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