我想用NSNumber实现简单的计算。
例如:
int a;
a=a*10;
a=a+1;
NSLog(@"%d",a);
如果我声明
,如何做同样的事情NSNumber *a;
我想用NSNumber实现相同的逻辑,我使用整数实现。 感谢
答案 0 :(得分:5)
没有明确支持在NSNumber
上进行数学运算。 NSNumber
用于包装基本类型编号。 (例如,将其用于存储在数组/ dicitionaries中)
如果您有一个NSNumber
实例并且想要进行数学运算,则应将其值提取为基本类型:
int num = [numberInstance intValue];
num += 1; // Just for the example;
完成后,创建一个用于存储新值的新实例(因为NSNumber
是不可变的,所以不能使用旧的NSNumber
实例)
numberInstance = [NSNumber numberWithInt:num];
答案 1 :(得分:4)
NSNumber对象中的乘法和加法过程非常困难
将其转换为int值以执行进程而不是返回NSNumber对象。
这里是您需要的代码
NSNumber *a;
int b = [a intValue];
b = b * 10;
b = b + 1;
a = [NSNumber numberWithInt:b];
答案 2 :(得分:0)
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 ++代码。