【问题标题】:Enum with NSnumber带有 NSnumber 的枚举
【发布时间】:2013-06-23 16:57:15
【问题描述】:

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

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

enum {
  ERROR,
  INCOMPLETE,
  OK
} EventStatus;

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

只是:

[muObjectOnCoredata setStatus: INCOMPLETE];

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

感谢您的帮助

【问题讨论】:

  • NSNumberNSInteger 之间存在巨大差异。 NSInteger 只是一个整数类型(类型定义为 intlong,取决于系统 - 在 iOS 上为 int),而 NSNumber 是一个对象(NSNumber * 是它的指针以及你如何使用它),这意味着它必须在运行时创建,因此不能像enums 那样是编译时常量。
  • #define INCOMPLETE [NSNumber numberWithInt:1]
  • @holex #define INCOMPLETE @1。它仍然是一个对象,应该与isEqual进行比较
  • @Kevin,你是对的,显而易见的解决方案是为 status 属性制作适当的 getter 和 setter。老实说,我会否决这个问题(但我不会),因为像“我懒得实现 setter 或 getter 来实现我想要的”这样的问题。
  • @holex 我不明白为什么要投反对票,实际上我没想过要做一个 getter 和 setter,希望我可以声明一个 NSNumber 枚举在我看来似乎更直接,现在我明白了更多关于那些我可以做出慎重选择的类型,谢谢

标签: objective-c c enums


【解决方案1】:

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

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

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

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

【讨论】:

  • 最好只创建一个在内部将枚举转换为 NSNumber 的 setter 和 getter。只需将其隐藏到对象实现中即可。
  • 有时,创建适当的 setter 和 getter 比这更好的代码模式。
  • 但这在其他情况下会有所帮助,例如它不在对象中。例如,在我们的项目中,我需要将枚举保存在 NSArray 中,并且 [array addObject:@(ConstantValue)];是非常好的。谢谢!
【解决方案2】:

将 managedObject 上的状态命名为statusNumber

然后

@dynamic statusNumber


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

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

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

【讨论】:

  • 因为它只是一个枚举,而不是一个typedef,所以类型必须是enum EventStatus
  • 您还可以在导出NSManagedObject 子类时选中“使用原始类型”,以便为动态属性自动实现这一点。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多