【发布时间】:2011-01-25 11:54:21
【问题描述】:
如何增加 NSNumber?
即我的NSNumber++
【问题讨论】:
-
记住:使用
NSNumber *时,一定要检查原始类型是否足够。 -
令我惊讶的是,没有提供快速/优化方式的答案,因为只是为了增加价值,您需要查询、组合和创建新对象,因此在循环中执行此操作可能会变得耗时.
标签: objective-c
如何增加 NSNumber?
即我的NSNumber++
【问题讨论】:
NSNumber *时,一定要检查原始类型是否足够。
标签: objective-c
NSNumber 对象是不可变的;你能做的最好的就是获取原始值,增加它然后将结果包装在它自己的NSNumber对象中:
NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
【讨论】:
更新:仅供参考,我个人更喜欢 BoltClock 和 DarkDusts 的单行答案。它们更简洁,不需要额外的变量。
为了增加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];
【讨论】:
... 代表什么?那是伪代码引用对吗? XCode 没有 ...
... 只是您想要的任何数字的占位符。
对于使用最新版本 Xcode(从 4.4.1、SDK 5.1 开始编写)的任何人,通过使用对象文字,您可以进一步清理代码......
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
处理装箱和拆箱来做简单的操作还是有点痛苦,但它正在变得更好,或者至少更短。
【讨论】:
NSNumber 是不可变的,您必须创建一个新实例。
// 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);
【讨论】:
NSNumber 对象是不可变的(?)
我喜欢点表达式,因为它更简洁,这也是 IOS 首先支持它的原因:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
【讨论】:
如果你用它来存储一个整数值:
myNSNumber = @(myNSNumber.longLongValue + 1);
对于浮点的东西,简短的回答如下,但这样做是个坏主意,你会失去精度,如果你稍后进行任何类型的比较,比如 [myNSNumber isEqual:@(4.5)] 你可能会感到惊讶:
myNSNumber = @(myNSNumber.floatValue + 1);
如果您需要对在 Objective-C 中表示为对象的浮点数进行数学运算(即,如果您需要将它们放入数组、字典等中),您应该使用 NSDecimalNumber。
【讨论】:
使用一个类别以方便将来使用。这是一个基本的想法。
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
【讨论】:
这个问题的答案中有很多很好的信息。我在我的代码中使用了选定的答案并且它有效。然后我开始阅读其余的帖子并大大简化了代码。如果你不熟悉 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);
【讨论】: