web-dev-qa-db-fra.com

Comparaison des numéros NSNumbers dans l’objectif C

Je suis débutant chez Obj-C et je suis un peu confus dans 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 vraiment étranges comme celui-ci:

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 objets NSNumber, comment une telle chose pourrait-elle arriver? Je reçois les deux nombres en trouvant les distances entre les sprites à l'écran.

Tout indice ou conseil serait vraiment apprécié

58
Doug Molineux

Je suppose que number1 et number2 sont des pointeurs sur des objets. Le signe <compare les pointeurs.

Vous devez comparer la valeur floatValue ou doubleValue réelle. 

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

....

103
Kal

Dans les cas où vous voulez simplement tester si deux propriétés de NSNumber contiennent la même valeur , dans 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 indique également: "Cette méthode est plus efficace que la comparaison: si vous savez que les deux objets sont des nombres".

Chaque fois que vous avez besoin de savoir si une valeur est plus petite ou plus grande, ils offrent la 

- (NSComparisonResult)compare:(NSNumber *)aNumber

méthode, mais personnellement, je préférerais à ce stade extraire simplement les valeurs entières (ou les valeurs doubles) et utiliser des opérateurs normaux <et> pour effectuer la comparaison, car cela facilite grandement la lecture du code, comme suit:

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 ça est beaucoup plus facile à lire que les appels à -compare :, à mon avis.

Erik

37
Erik van der Neut

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

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

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

}
0
William Hu