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é
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])
....
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
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
}