想知道如何在算术运算中处理nsnumber对象

时间:2010-01-12 18:40:29

标签: objective-c oop nsnumber

我看到了这个帖子,但想确认一下:

How to convert NSNumber objects for computational purposes?

所以基本上你想要处理这些对象时,你必须解压缩他们的ivars,然后将它们打包回新对象,大概是NSNumbers?

这看起来很弱(背面有很大的疼痛,没有?)。

你们如何使用这些?

你避开它们吗?对它们进行子类化?是否有可变版本?

这似乎是很多工作要处理它们,我们很乐意听到它们的好处以及更有经验的程序员使用它们的方式,或者他们用来避免使用它们的策略。

谢谢,

尼克

3 个答案:

答案 0 :(得分:6)

  

所以基本上你想要处理这些对象时,你必须解压缩他们的ivars,然后将它们打包回新对象,大概是NSNumbers?

是。 (顺便说一下,调用doubleValue并不仅仅意味着解压缩ivar。也许还有一些转换。)

  

这看起来很弱(背面有很大的疼痛,没有?)。

这种“拳击”是必要的,因为原始数字本身不支持Objective-C(Foundation.framework)的引用计数方案。例如,您必须将数字设为NSNumber才能将其存储在NSArray中。

  你避开它们吗?

你做不到。

  

他们的子类?

你不应该,但如果必须,请按照它的建议:

  • 与任何类集群一样,如果创建NSNumber的子类,则必须覆盖其超类NSValue的基本方法。此外,为了利用非原始方法的抽象实现,NSValue方法objCType的实现可以返回一组有限的返回值。有效返回值为“c”,“C”,“s”,“S”,“i”,“I”,“l”,“L”,“q”,“Q”,“f”和“d”。

如果你想要的只是添加一些方便的方法,例如-numberByAddingNumber:,使用类别

@implementation NSNumber (MyExtension)
-(NSNumber*)numberByAddingNumber:(NSNumber*)another {
   double myVal = [self doubleValue];
   double anotherVal = [another doubleValue];
   return [NSNumber numberWithDouble:myVal + anotherVal];
}
@end
...
NSNumber* a, *b;
...
NSNumber* c = [a numberByAddingNumber:b];
...
  

有可变版本吗?

没有

答案 1 :(得分:3)

当我不得不对变量执行算术时,我避免使用NSNumbers。实际上,我总是避免使用它们,除非我要将它们转换为Core Data或其他东西。

答案 2 :(得分:2)

现在最新版本的clang编译器中有Objective-C Literals(版本3.2以上,Xcode 4.6附带,也可以从源代码构建),你可以做@ 42和@(7 + 35)之类的东西“盒子”NSNumbers。