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

nic*_*ude 3 oop objective-c nsnumber

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

如何转换NSNumber对象用于计算目的?

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

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

你们这些人如何使用这些?

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

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

谢谢,

缺口

ken*_*ytm 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];
...
Run Code Online (Sandbox Code Playgroud)

有可变版本吗?

没有.