Comparez un NSNumber à un int
J'ai une question simple (je pense):
Je suis en train de comparer un NSNumber avec un int, pour voir si elle est de 0 ou 1. Voici le code:
id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber
NSLog(@"%@ == 0 -> %@", i, i == 0);
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]);
J'ai essayé de méthodes, mais je reçois la valeur null comme résultat:
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)
Pouvez-vous m'aider?
source d'informationauteur patrick
Vous devez vous connecter pour publier un commentaire.
Le résultat de la comparaison est une valeur BOOLÉENNE qui n'est pas un Objectif-C objet. Par conséquent, vous devriez pas l'imprimer à l'aide de
%@
. Essayez%d
au lieu (affiche la valeur 0 ou 1).[a compare:b]
retourne -1 sia < b
0 sia == b
et 1 sia > b
. Si votre 2ème résultat escompté.Vous ne pouvez pas comparer un NSNumber directement avec un entier. Que
i == 0
est en fait un pointeur comparaison qui vérifie sii
est NULLE (0), ce qui bien sûr est FAUX, si le numéro existe. Ainsi, le 1er résultat est également prévu.Si vous souhaitez vérifier l'égalité, utiliser
[un isEqualToNumber:b]
. Vous pouvez également extraire l'entier avec[a intValue]
et de comparer avec un autre nombre entier directement.Alors ce qui suit devrait fonctionner:
Si le "nombre" est en fait un booléen, il est préférable de prendre un
-boolValue
à la place.Ici vous êtes en comparant le pointeur de l'objet que je avec 0, ce qui je le crains n'est pas ce que vous voulez.
Vous voudrez certainement pour comparer la valeur de i:
Vous pouvez facilement écrire:
Sortie doit être
J'espère que je peux vous aider!
Vous avez deux problèmes:
NSLog
chaîne de format ne correspond pas aux types des arguments que vous fournissez.Concernant le premier problème:
i
est une adresse, peut-être quelque chose comme0x1f84b
. Lorsque vous testez sii == 0
à vous de tester sii == NULL
. Dans ce cas, cela signifie que vous êtes tester si la touche "erreur" était présent dans le dictionnaire ou pas, depuis la recherche d'un inexistante clé bénéficie d'unNULL
.[i intValue]
d'autre part, est un entier. Si leNSNumber
contient une valeur représentable par un nombre entier, ce sera la valeur de laNSNumber
. Qu'est ce que vous voyez lorsque vous imprimez leNSNumber
'description à l'aide de la%@
spécificateur de format.Ce qui concerne le deuxième problème: les Comparaisons en C et Objective-C retourner un entier, soit à 0 (ce qui signifie faux) ou 1 (vrai). Afin d'imprimer directement le résultat d'une comparaison, vous devez donc utiliser l'entier spécificateur de format. Il y a en fait deux de ces prescripteurs,
%i
et%d
. Vous pouvez rassembler le résultat de la comparaison dans un NSNumber et l'utilisation%@
à l'impression, mais c'est plus de travail que ce qu'il vaut.Donc, voici ce que vous devriez faire:
Cela a fonctionné