【问题标题】:iOS5 Core Data and NSNumber is there autoboxing/unboxing?iOS5 Core Data 和 NSNumber 是否有自动装箱/拆箱?
【发布时间】:2011-12-25 00:54:58
【问题描述】:

来自 Java,我很习惯 autoboxing,其中 int 会在需要时自动包装为 Integer,而 Integer 可能会被拆箱为原语。在 iOS5 中我可以依赖类似的东西吗?

目前,我正在使用核心数据,并且需要大量输入才能继续输入

 number.intValue
 //or 
number.boolValue 

有什么方法可以直接在方程式等中使用 NSNumber? 例如:

int x = 5+ nsNumberInstance;

此外,每次我需要在核心数据中重新分配一个数字时,我都会像这样创建一个新对象。

managedObject.dynamicProperty = [NSNumber numberWithInt: int];

有没有更好的方法来改变已经创建的 NSNumber 的值? 10 年后我可以使用哪些漂亮的捷径来拯救自己从腕管中解救出来?

谢谢!

【问题讨论】:

    标签: ios core-data ios5 nsnumber autoboxing


    【解决方案1】:

    实际上,当您在数据模型中并使用“创建 NSManagedObject 子类”菜单项时,可以选择标题为“使用原始数据类型的标量属性”的选项。

    这在很多情况下会自动为您处理。
    以下是一些示例:

    布尔值:
    @property (nonatomic, retain) NSNumber * aBool;
    变成
    @property (nonatomic) BOOL aBool;

    NSDate:
    @property (nonatomic, retain) NSDate * aDate;
    变成
    @property (nonatomic) NSTimeInterval aDate;

    整数 32:
    @property (nonatomic, retain) NSNumber * aNumber;
    变成了
    @property (nonatomic) int32_t aNumber;

    浮动:
    @property (nonatomic, retain) NSNumber * aFloat;
    变成了
    @property (nonatomic) float aFloat;

    NSDecimalNumber 和 NSString 保持不变。

    如果您已经生成了子类,您可以在之前生成的头文件中自己更改这些,并且访问器方法将自动更新而无需重新生成子类。

    【讨论】:

      【解决方案2】:

      除了 Cocoa 绑定之外,我想不出还有很多其他地方在 Cocoa 或 Cocoa touch 中具有标量类型的自动装箱功能,所以很遗憾,你在那儿不走运。

      在计算中使用 NSNumbers 并没有真正获得任何好处,因此处理那里的对象并不是真正必要的。使用标量类型要容易得多,然后在将这些数字存储在 Core Data、数组等中时在 NSNumbers 之间来回转换。您希望保持这种形式的一种情况是 NSDecimalNumbers,它不代表数字作为标准浮点值,从而避免在尝试使用这些类型的小数时看到的故障。

      Core Data 存储对象,因此您不会在基础级别解决这个问题,但是您可以通过在您的 NSManagedObject 子类上使用自定义访问器来获取和返回标量值,从而使您的生活更轻松一些。 Apple 在核心数据编程指南的“Managed Object Accessor Methods”部分中有一个示例,其中展示了如何为 CGFloat 值设置访问器,而不是使用 NSNumber:

      @interface Circle : NSManagedObject
      {
          CGFloat radius;
      }
      @property CGFloat radius;
      @end
      
      @implementation Circle
      
      - (CGFloat)radius
      {
          [self willAccessValueForKey:@"radius"];
          float f = radius;
          [self didAccessValueForKey:@"radius"];
          return f;
      }
      
      - (void)setRadius:(CGFloat)newRadius
      {
          [self willChangeValueForKey:@"radius"];
          radius = newRadius;
          [self didChangeValueForKey:@"radius"];
      }
      @end
      

      作为旁注,不建议对-intValue-boolValue 使用点语法,虽然它有效,但不推荐。这些不是属性,而是从 NSNumber 中提取值的单向方法。处理它们时使用方括号以在代码中明确这一点。

      【讨论】:

      • 感谢布拉德,这是一个非常棒的方法,并且回答了我要发布的其他问题之一!
      • 认为这是对点语法的评论的额外 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 2018-06-20
      • 1970-01-01
      • 2012-07-15
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多