来自Java,我已经习惯了 autoboxing ,其中int在需要时自动包装到Integer,并且Integer可以解包到基元中。在iOS5中是否有类似我可以依赖的东西?
目前,我正在使用核心数据,需要进行大量输入才能输入
number.intValue
//or
number.boolValue
有没有办法直接在方程中使用NSNumber?,例如:
int x = 5+ nsNumberInstance;
此外,每次我需要在核心数据中重新分配一个数字时,我正在创建一个这样的新对象。
managedObject.dynamicProperty = [NSNumber numberWithInt: int];
有没有更好的方法来改变已经创建的NSNumber的值? 10年后,我可以使用哪种漂亮的快捷方式来保存我自己的腕管?
谢谢!
答案 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中提取值的单向方法。在处理它们时使用括号,以便在代码中清楚地表明这一点。