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