web-dev-qa-db-ja.com

Objective CでのNSNumbersの比較

私はObj-Cの初心者であり、このシナリオでは少し混乱していますが、次のコードがあります:

if (number1 < number2) {

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

}

このコードを実行すると、次のような非常に奇妙な結果が表示されます。

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

両方の番号はNSNumberオブジェクトですが、このようなことがどのように発生しますか?画面上のスプライト間の距離を見つけることで2つの数値を取得しています。

手がかりやアドバイスは本当にありがたいです

62
Doug Molineux

Number1とnumber2はオブジェクトへのポインターであると想定しています。 <記号はポインターを比較しています。

実際のfloatValueまたはdoubleValueを比較する必要があります

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

....

107
Kal

2つのNSNumberプロパティが同じ値を保持しているかどうかを単にテストしたい場合、Appleドキュメンテーションから

- (BOOL)isEqualToNumber:(NSNumber *)aNumber

2つのNSNumber値を比較する最も簡単で効率的な方法です。

例えば:

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

ドキュメントには、「この方法は比較するよりも効率的です。2つのオブジェクトが数値であることがわかっている場合」も記載されています。

値が小さいか大きいかを知る必要があるときはいつでも、それらは提供します

- (NSComparisonResult)compare:(NSNumber *)aNumber

メソッドですが、個人的には、整数値(またはdouble値)を引き出して、通常の<および>演算子を使用して比較を行うことをお勧めします。これにより、コードが読みやすくなります。

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
}

私の意見では、そのようなものは-compare:を呼び出すよりも読みやすいです。

エリック

38

NSNumberには比較のためのメソッドがあります:-(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