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

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

то есть. myNSNumber ++

Ответ 1

Обновление: FYI, мне лично нравятся 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];

Ответ 2

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

NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];

Ответ 3

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

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

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

Ответ 4

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

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

// EDIT: With modern syntax:
myNSNumber = @([myNSNumber longLongValue] + 1);

Ответ 5

Поместите их все вместе, и у вас есть:

myNSNumber = @(myNSNumber.intValue + 1);

Ответ 6

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

myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];

Ответ 7

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

myNSNumber = @(myNSNumber.longLongValue + 1);

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

myNSNumber = @(myNSNumber.floatValue + 1);

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

Ответ 8

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

 - (void)incrementIntBy:(int)ammount {
      self = [NSNumber numberWithInt:(self.intValue + ammount)];
 }

Ответ 9

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