1

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

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

 number.intValue
 //or 
number.boolValue 

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

int x = 5+ nsNumberInstance;

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

managedObject.dynamicProperty = [NSNumber numberWithInt: int];

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

谢谢!

4

2 回答 2

7

实际上,当您在数据模型中并使用“创建 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 保持不变。

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

于 2012-01-01T16:45:10.910 回答
3

在 Cocoa 绑定之外,我想不出许多其他地方在 Cocoa 或 Cocoa touch 中具有标量类型的自动装箱,所以不幸的是你在那里不走运。

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

Core Data 存储对象,因此您不会在基础级别解决这个问题,但是您可以通过在您的 NSManagedObject 子类上使用自定义访问器来获取和返回标量值,从而使您的生活更轻松一些。Apple 在核心数据编程指南的“托管对象访问器方法”部分中有一个示例,其中展示了如何为 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

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

于 2011-11-09T19:01:03.773 回答