如何增加一个NSNumber
我如何增加一个NSNumber?
即myNSNumber ++
更新:FYI,我个人比较喜欢BoltClock和DarkDusts的单行答案。 它们更简洁,不需要额外的variables。
为了增加一个NSNumber
,你将不得不获得它的值,增加它,并把它存储在一个新的NSNumber
。
例如,对于一个NSNumber
持有一个整数:
NSNumber *number = [NSNumber numberWithInt:...]; int value = [number intValue]; number = [NSNumber numberWithInt:value + 1];
或者为一个NSNumber
持有一个浮点数:
NSNumber *number = [NSNumber numberWithDouble:...]; double value = [number doubleValue]; number = [NSNumber numberWithDouble:value + 1.0];
NSNumber
对象是不可变的; 你可以做的最好的办法是获取原始值,然后将结果放在自己的NSNumber
对象中:
NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
对于任何正在使用最新版本的Xcode(使用4.4.1,SDK 5.1编写)的用户,使用对象文字,可以清理代码,甚至更多一点。
NSNumber *x = @(1); x = @([x intValue] + 1); // x = 2
处理拳击和拆箱所有事情都是为了做一些简单的操作,但这样做还是有点痛苦的,但是现在变得越来越好,或者至less变短了。
NSNumbers是不可变的,你必须创build一个新的实例。
// Work with 64 bit to support very large values myNSNumber = [NSNumber numberWithLongLong:[myNSNumber longLongValue] + 1]; // EDIT: With modern syntax: myNSNumber = @([myNSNumber longLongValue] + 1);
把它们放在一起,你有:
myNSNumber = @(myNSNumber.intValue + 1);
我喜欢点expression,因为它更简洁,这就是为什么IOS首先支持它:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
如果您使用它来存储一个整数值:
myNSNumber = @(myNSNumber.longLongValue + 1);
对于浮点数来说,简短的答案是以下几点,但是这样做不是一个好主意,你会失去精确性,如果你稍后进行任何forms的比较,比如[myNSNumber isEqual:@(4.5)],你可能会感到惊讶:
myNSNumber = @(myNSNumber.floatValue + 1);
如果您需要在Objective-C中以对象表示的浮点数(即,如果您需要将它们放入数组,字典等)中进行math计算,则应该使用NSDecimalNumber
。
使用一个类别来减轻将来的使用。 这是一个基本的想法。
- (void)incrementIntBy:(int)ammount { self = [NSNumber numberWithInt:(self.intValue + ammount)]; }
在这个问题的答案很多很好的信息。 我用我的代码中select的答案,它的工作。 然后,我开始阅读其余的post,并简化了很多代码。 如果您不熟悉Xcode 5中引入的符号更改,那么阅读起来会有点困难,但它更加清晰。 我大概可以把它做成一行,但是要弄清楚我在做什么有点太难了。
我正在一个字典中存储一个NSNumber,我想增加它。 我得到它,将其转换为一个int,增加它,而将其转换为一个NSNumber,然后把它放回字典。
老代码
NSNumber *correct = [scoringDictionary objectForKey:@"correct"]; int correctValue = [correct intValue]; correct = [NSNumber numberWithInt:correctValue + 1]; [scoringDictionary removeObjectForKey:@"correct"]; scoringDictionary[@"correct"] = correct;
新的代码
NSNumber *correct = [scoringDictionary objectForKey:@"correct"]; scoringDictionary[@"correct"] = @(correct.intValue + 1);