¿Cómo incremento un NSNumber?
es decir, myNSNumber ++
¿Cómo incremento un NSNumber?
es decir, myNSNumber ++
Respuestas:
Actualización: FYI, personalmente me gustan más las respuestas de una línea de BoltClock y DarkDusts. Son más concisos y no requieren variables adicionales.
Para incrementar un NSNumber
, tendrá que obtener su valor, incrementarlo y almacenarlo en una nuevaNSNumber
.
Por ejemplo, para NSNumber
mantener un número entero:
NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];
O para NSNumber
mantener un número de punto flotante:
NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];
...
soporte? Esa es una referencia de pseudocódigo, ¿verdad? XCode no lo hace...
...
es solo un marcador de posición para cualquier número que desee.
NSNumber
los objetos son inmutables; lo mejor que puede hacer es tomar el valor primitivo, incrementarlo y luego envolver el resultado en su propio NSNumber
objeto:
NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
Para cualquiera que esté usando la última versión de Xcode (escribiendo esto a partir de 4.4.1, SDK 5.1), con el uso de objetos literales, puede limpiar el código incluso un poco más ...
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
Sigue siendo un poco doloroso lidiar con el boxeo y desempaquetar todo para hacer operaciones simples, pero está mejorando, o al menos más corto.
Ponlos todos juntos y tienes:
myNSNumber = @(myNSNumber.intValue + 1);
NSNumber
objetos son inmutables (?)
Me gusta la expresión de puntos porque es más concisa y es por eso que IOS la admite en primer lugar:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
Si lo está utilizando para almacenar un valor integral:
myNSNumber = @(myNSNumber.longLongValue + 1);
Para cosas de punto flotante, la respuesta corta es la siguiente, pero es una mala idea hacer esto, perderá precisión y si está haciendo algún tipo de comparación más adelante como [myNSNumber isEqual: @ (4.5)] puede que se sorprenda :
myNSNumber = @(myNSNumber.floatValue + 1);
Si necesita hacer matemáticas con números de punto flotante representados como objetos en Objective-C (es decir, si necesita ponerlos en matrices, diccionarios, etc.), debe usar NSDecimalNumber
.
Utilice una categoría para facilitar el uso futuro. He aquí una idea básica.
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
Mucha buena información en las respuestas a esta pregunta. Usé la respuesta seleccionada en mi código y funcionó. Luego comencé a leer el resto de las publicaciones y simplifiqué mucho el código. Es un poco más difícil de leer si no está familiarizado con los cambios en la notación que se introdujeron en Xcode 5, pero es mucho más limpio. Probablemente podría hacer solo una línea, pero luego es un poco difícil averiguar qué estoy haciendo.
Estoy almacenando un NSNumber en un diccionario y quiero incrementarlo. Lo consigo, lo convierto en un int, lo incremento mientras lo convierto en un NSNumber, luego lo vuelvo a poner en el diccionario.
Código antiguo
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
int correctValue = [correct intValue];
correct = [NSNumber numberWithInt:correctValue + 1];
[scoringDictionary removeObjectForKey:@"correct"];
scoringDictionary[@"correct"] = correct;
Nuevo código
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
NSNumber *
, compruebe siempre si los tipos primitivos son suficientes.