Comment incrémenter un NSNumber?
ie myNSNumber ++
Comment incrémenter un NSNumber?
ie myNSNumber ++
Réponses:
Mise à jour: FYI, j'aime personnellement mieux les réponses en une ligne de BoltClock et DarkDusts. Ils sont plus concis et ne nécessitent pas de variables supplémentaires.
Pour incrémenter un NSNumber, vous allez devoir obtenir sa valeur, l'incrémenter et le stocker dans un nouveauNSNumber .
Par exemple, pour un NSNumbertenant un entier:
NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];
Ou pour NSNumbertenir un nombre à virgule flottante:
NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];
...support? C'est une référence de pseudo-code, non? XCode does...
...est juste un espace réservé pour n'importe quel nombre que vous voulez.
NSNumberles objets sont immuables; le mieux que vous puissiez faire est de saisir la valeur primitive, de l'incrémenter puis d'envelopper le résultat dans son propre NSNumberobjet:
NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
Pour tous ceux qui utilisent la dernière version de Xcode (en écrivant ceci à partir de 4.4.1, SDK 5.1), avec l'utilisation de littéraux d'objet, vous pouvez nettoyer le code encore un peu plus ...
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
Encore un peu pénible de gérer la boxe et de tout déballer pour faire des opérations simples, mais ça va mieux, ou du moins plus court.
Mettez-les tous ensemble, et vous avez:
myNSNumber = @(myNSNumber.intValue + 1);
NSNumberobjets sont immuables (?)
J'aime l'expression dot car elle est plus concise et c'est pourquoi IOS la prend en charge en premier lieu:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
Si vous l'utilisez pour stocker une valeur intégrale:
myNSNumber = @(myNSNumber.longLongValue + 1);
Pour les trucs en virgule flottante, la réponse courte est la suivante, mais c'est une mauvaise idée de le faire, vous perdrez de la précision et si vous faites une sorte de comparaison plus tard comme [myNSNumber isEqual: @ (4.5)] vous pourriez être surpris :
myNSNumber = @(myNSNumber.floatValue + 1);
Si vous avez besoin de faire des maths sur des nombres à virgule flottante représentés comme des objets en Objective-C (c'est-à-dire si vous devez les mettre dans des tableaux, des dictionnaires, etc.), vous devriez utiliser NSDecimalNumber.
Utilisez une catégorie pour faciliter l'utilisation future. Voici une idée de base.
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
Beaucoup de bonnes informations dans les réponses à cette question. J'ai utilisé la réponse sélectionnée dans mon code et cela a fonctionné. Ensuite, j'ai commencé à lire le reste des articles et j'ai beaucoup simplifié le code. C'est un peu plus difficile à lire si vous n'êtes pas familier avec les changements de notation introduits dans Xcode 5, mais c'est beaucoup plus propre. Je pourrais probablement en faire juste une ligne, mais c'est un peu trop difficile de comprendre ce que je fais.
Je stocke un NSNumber dans un dictionnaire et je souhaite l'incrémenter. Je l'obtiens, le convertis en un entier, l'incrémente en le convertissant en NSNumber, puis le remets dans le dictionnaire.
Ancien code
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
int correctValue = [correct intValue];
correct = [NSNumber numberWithInt:correctValue + 1];
[scoringDictionary removeObjectForKey:@"correct"];
scoringDictionary[@"correct"] = correct;
Nouveau code
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
NSNumber *, vérifiez toujours si les types primitifs suffiront.