Как увеличить NSNumber?
то есть. myNSNumber ++
Как увеличить NSNumber?
то есть. myNSNumber ++
Обновление: 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];
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
Еще одна боль, связанная с боксом и распаковкой всего, чтобы делать простые операции, но она становится лучше или, по крайней мере, короче.
NSNumbers неизменяемы, вам нужно создать новый экземпляр.
// 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);
Мне нравится выражение в точках, потому что оно более кратким, и поэтому 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);