如何使用NSNumber进行乘法和加法运算

6

我想使用NSNumber进行简单的计算。

例如:

int a;
a=a*10;
a=a+1;
NSLog(@"%d",a);

如果我声明了一个变量,该如何做相同的事情?
NSNumber *a;

我希望使用NSNumber实现与我使用整数实现的相同逻辑。 谢谢。

1
这与Xcode无关。你尝试过什么?(这很简单。) - The Paramagnetic Croissant
3个回答

8

NSNumber上执行数学运算没有明确的支持。 NSNumber用于包装原始类型数字。(例如,将其用于存储在数组/字典中)

如果您有一个NSNumber实例并且想进行数学运算,您应该将其值提取为原始类型:

int num = [numberInstance intValue]; 
num += 1; // Just for the example;

完成后,您需要创建一个新实例来存储新值(因为 NSNumber 是不可变的,所以您不能使用旧的 NSNumber 实例)。

numberInstance = [NSNumber numberWithInt:num];

4

NSNumber对象中的乘法和加法过程非常困难。

将其转换为int值以执行操作,然后再将其转换回NSNumber对象。

这里是所需代码:

NSNumber *a;
int b = [a intValue];
b = b * 10;
b = b + 1;
a = [NSNumber numberWithInt:b];

1

NSNumber是任何通用整数类型的包装类。为了进行算术运算,您必须获取要进行算术运算的数据的原始类型,然后执行算术运算,然后再将其重新包装在NSNumber中。

以下是将数字乘以5并加上4的示例:

NSNumber *num = // get this somewhere
num = @(num.intValue * 5 + 4);

在理论上,可以创建一个子类,并使用-addInt等方法,但我个人喜欢使用如下的宏:
#define NSNumberAddInt(num, i) num = @( num.intValue + i )
#define NSNumberMultiplyInt(num, i) num = @( num.intValue * i )
#define NSNumberMultiplyAddInt(num, i, j) num = @(num.intValue * i + j)

实际上,我有一些更复杂的宏,实际上声明了内联函数:

#define NSNumberDeclareAddType(type, utype) \\
  inline NSNumber *NSNumberAdd ## utype ( NSNumber *inNum, type i ) {
    return @( inNum. type ## Value + i );
  }
#define NSNumberDeclareMultiplyType(type, utype) \\
  inline NSNumber *NSNumberMultiply ## utype ( NSNumber *inNum, type i ) {
    return @( inNum. type ## Value * i );
  }
#define NSNumberDeclareMultiplyAddType(type, utype) \\
  inline NSNumber *NSNumberMultiplyAdd ## utype ( NSNumber *inNum, type i, type j ) {
    return @( inNum. type ## Value * i + j );
  }
#define NSNumberDecalreArithmeticType(type, utype) NSNumberDeclareAddType(type, utype) \\
  NSNumberDeclareMultiplyType(type, utype) \\
  NSNumberDeclareMultiplyAddType(type, utype)

然后添加类似以下的行:

NSNumberDecalreArithmeticType(int, Int)
NSNumberDecalreArithmeticType(float, Float)
NSNumberDecalreArithmeticType(double, Double)

当然,理论上可以使用c++模板来简化这个过程,但我不是c++大师(事实上我一般也不是大师),所以我不想发布任何c++代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接