Как увеличить NSNumber - PullRequest
       2

Как увеличить NSNumber

106 голосов
/ 25 января 2011

Как мне увеличить NSNumber?

т.е. myNSNumber ++

Ответы [ 9 ]

124 голосов
/ 25 января 2011

NSNumber объекты неизменны; лучшее, что вы можете сделать, - это получить примитивное значение, увеличить его, а затем обернуть результат в собственный объект NSNumber:

NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
122 голосов
/ 25 января 2011

Обновление: к вашему сведению, мне лично больше нравятся однострочные ответы 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];
77 голосов
/ 31 августа 2012

Для тех, кто использует последнюю версию XCode (в которой написано 4.4.1, SDK 5.1), с использованием объектных литералов вы можете очистить код еще немного ...

NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2

По-прежнему немного больно иметь дело с боксом и распаковкой всего, чтобы выполнять простые операции, но все становится лучше или, по крайней мере, короче.

30 голосов
/ 25 января 2011

NSNumbers являются неизменными, вы должны создать новый экземпляр.

// Work with 64 bit to support very large values
myNSNumber = [NSNumber numberWithLongLong:[myNSNumber longLongValue] + 1];

// EDIT: With modern syntax:
myNSNumber = @([myNSNumber longLongValue] + 1);
24 голосов
/ 25 мая 2013

Сложите их все вместе, и вы получите:

myNSNumber = @(myNSNumber.intValue + 1);
3 голосов
/ 09 января 2013

Мне нравится выражение точки, потому что оно более лаконично, и поэтому IOS поддерживает его в первую очередь:

myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
2 голосов
/ 07 июня 2013

Если вы используете его для хранения целочисленного значения:

myNSNumber = @(myNSNumber.longLongValue + 1);

Для вещей с плавающей запятой короткий ответ следующий, но это плохая идея, вы потеряете точность иесли вы позже выполните какое-либо сравнение, например, [myNSNumber isEqual: @ (4.5)], вы можете быть удивлены:

myNSNumber = @(myNSNumber.floatValue + 1);

Если вам нужно выполнить математику для чисел с плавающей запятой, представленных как объекты в Objective-C (т.е. если вам нужно поместить их в массивы, словари и т. Д.), Вы должны использовать NSDecimalNumber.

0 голосов
/ 21 ноября 2013

Много полезной информации в ответах на этот вопрос.Я использовал выбранный ответ в моем коде, и это сработало.Затем я начал читать остальные посты и значительно упростил код.Это немного сложнее читать, если вы не знакомы с изменениями в обозначениях, которые были введены в 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);
0 голосов
/ 25 сентября 2013

Используйте категорию, чтобы облегчить использование в будущем. Вот основная идея.

 - (void)incrementIntBy:(int)ammount {
      self = [NSNumber numberWithInt:(self.intValue + ammount)];
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...