iOS5核心数据和NSNumber是否有自动装箱/拆箱?

时间:2011-11-09 05:37:20

标签: ios core-data ios5 nsnumber autoboxing

来自Java,我已经习惯了 autoboxing ,其中int在需要时自动包装到Integer,并且Integer可以解包到基元中。在iOS5中是否有类似我可以依赖的东西?

目前,我正在使用核心数据,需要进行大量输入才能输入

 number.intValue
 //or 
number.boolValue 

有没有办法直接在方程中使用NSNumber?,例如:

int x = 5+ nsNumberInstance;

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

managedObject.dynamicProperty = [NSNumber numberWithInt: int];

有没有更好的方法来改变已经创建的NSNumber的值? 10年后,我可以使用哪种漂亮的快捷方式来保存我自己的腕管?

谢谢!

2 个答案:

答案 0 :(得分:7)

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

在许多情况下,这会自动为您处理 以下是一些例子:

BOOL:
@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保持不变。

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

答案 1 :(得分:3)

在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的点语法,虽然它有效。这些不是属性,而是从NSNumbers中提取值的单向方法。在处理它们时使用括号,以便在代码中清楚地表明这一点。

相关问题