Comparaison des numéros NSN en Objectif C

Je suis débutant chez Obj-C et je suis un peu confus par ce scénario. J’ai le code suivant:

if (number1 < number2) { NSLog(@"THE FOLLOWING NUMBER "); NSLog(@"%@", number1); NSLog(@"IS LESS THAN"); NSLog(@"%@", number2); } 

Quand je lance ce code, je vois des résultats très étranges comme ceci:

 2011-07-06 20:38:18.044 helloworld[1014:207] THE FOLLOWING NUMBER 2011-07-06 20:38:18.047 helloworld[1014:207] 190.8776 2011-07-06 20:38:18.050 helloworld[1014:207] IS LESS THAN 2011-07-06 20:38:18.053 helloworld[1014:207] 96.75866 

Les deux nombres sont des objects NSNumber, comment cela pourrait-il se passer? J’obtiens les deux nombres en trouvant des distances entre les sprites sur l’écran.

Des indices ou des conseils seraient vraiment appréciés

Je suppose que number1 et number2 sont des pointeurs vers des objects. Le signe

Vous devez comparer la valeur réelle floatValue ou doubleValue

 if ([number1 doubleValue] < [number2 doubleValue]) 

....

Pour les cas où vous voulez simplement tester si deux propriétés NSNumber ont la même valeur , alors, à partir de la documentation Apple, il semble que l’utilisation de

 - (BOOL)isEqualToNumber:(NSNumber *)aNumber 

est le moyen le plus simple et le plus efficace de comparer deux valeurs NSNumber.

Par exemple:

 if ([someNumber isEqualToNumber:someOtherNumber]) { // The numbers hold the same value } else { // The numbers hold different values } 

La documentation dit aussi “Cette méthode est plus efficace que la comparaison: si vous savez que les deux objects sont des nombres.”

Chaque fois que vous avez besoin de savoir si une valeur est inférieure ou supérieure, ils offrent le

 - (NSComparisonResult)compare:(NSNumber *)aNumber 

méthode, mais personnellement, je préférerais à ce stade simplement extraire les valeurs entières (ou les valeurs doubles) et utiliser les opérateurs réguliers pour faire la comparaison, car cela rend le code beaucoup plus facile à lire, comme ceci:

 if (firstNumber.intValue > secondNumber.intValue) { // First number is greater than the second number } else if (firstNumber.intValue == secondNumber.intValue) { // The two numbers have the same value } else { // The first number is smaller than the second number } 

Quelque chose comme cela est beaucoup plus facile à lire que les appels à -compare :, à mon avis.

Erik

NSNumber a une méthode de comparaison: – (NSComparisonResult) compare: (NSNumber *) aNumber

 if([numberOne compare:numberTwo] == NSOrderedSame) { // proceed } 

Swift 3.1

 let number1 = NSNumber(value: 10.2) let number2 = NSNumber(value: 20.2) let result = number1.compare(number2) if result == .orderedAscending { } else if result == .orderedDescending { } else { // .orderedSame }