Objective-Cの新しいリテラルが本当に好きです。私は新しい追加があれば数字を比較する良い方法があるのだろうかと思っています。例えばNSNumberリテラルの比較
、私はa
とb
を比較したい場合:
a = @1;
b = @2;
は、このようにそれらを比較するための唯一の方法です:
[a intValue] > [b intValue]
以上、よりエレガントな、解決策がありますか?
Objective-Cの新しいリテラルが本当に好きです。私は新しい追加があれば数字を比較する良い方法があるのだろうかと思っています。例えばNSNumberリテラルの比較
、私はa
とb
を比較したい場合:
a = @1;
b = @2;
は、このようにそれらを比較するための唯一の方法です:
[a intValue] > [b intValue]
以上、よりエレガントな、解決策がありますか?
は平等性チェックのために、あなたは(後者はcompare
を使用して)チェックisEqualToNumber
を使用することができると言うことができます。
if ([a isEqualToNumber:b]) // if a == b
わからないなぜを彼ら以下のcompare
メソッドが少し不器用なように思われるので、isGreaterThanNumber
とisLessThanNumber
の便利なメソッド(および可能であれば>=
と<=
も実装していません)。
if ([a compare:b] == NSOrderedSame) // if (a == b)
if ([a compare:b] == NSOrderedAscending) // if (a < b)
if ([a compare:b] == NSOrderedDescending) // if (a > b)
if ([a compare:b] != NSOrderedSame) // if (a != b)
if ([a compare:b] != NSOrderedAscending) // if (a >= b)
if ([a compare:b] != NSOrderedSescending) // if (a <= b)
詳細はNSNumber class documentation pageで見つけることができます:ちょうど(下の最初の1から分かるように、あなたも平等のためにこれを行うことができます)直接compare
を使用不平等チェックのために
、。
if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no)
か::
if (nsnComp2 (a, b) >= 0) ... // returns -1/0/+1
にもかかわらず、例えば、コードのようなことが可能になる独自のヘルパー関数を作成するからあなたを妨げるものは何もありません心の中で
くださいObjective-CやC :-)が少なくなっています。あなたの "エレガント"の定義が、効率性や可読性に拘束されているかどうかによって異なります。それがあなたのintValue
オプションよりも好ましいかどうかは、自分で判断する必要があります。
NSNumber
は、-compare:
(他の多くのクラスと同じように)を実装します。だから、id
またはコンテンツのいずれかが等しい場合
switch ([a compare:b]) {
case NSOrderedAscending: // a < b
// blah blah
break;
case NSOrderedSame: // a == b
// blah blah
break;
case NSOrderedDescending: // a > b
// blah blah
break;
}
のNSNumberもisEqualToNumberがあります。ここでは
は良い働くチェックするコードスニペットです:
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
出力:
1
1
1
結論:
比較を理解するには、インスタンスの割り当てを理解する必要があります。NSNumberは内部的に割り当てられたオブジェクトのキャッシュを実装し、値を使用して既存のオブジェクトを新しく作成されたオブジェクトにマッピングします。値1を保持している既存のNSNumberオブジェクトが見つかった場合、新しいNSNumberインスタンスは作成されません。
もしあなたが '[a greaterThan:b]'や '[a equalTo:b]'のようなメソッドを追加するカテゴリを書くことができます – pasawaya
オペレータのコンパイラの書き換えが最終的にこの数値リテラルの拡張として現れる可能性があります構文。 '' @ NSNumber numberWithInt:1 ''になっています。 '@ 1 isGreaterThan:@ 2 'のように' @ 1> @ 2 'を許可したり書き換えたりすることはできません。混乱の可能性を除いて:「私は '(1> @ 2)'をしないのはなぜですか?」)。 –
確かに、低レベルのポインタ比較を取り除くだろうが、いつも@ 1 @> = @ 2のようなことをしてからNSNumberにgreaterThanOrEqualToを実装することができるので、[@ 1 greaterThanOrEqualTo: @ 2] ...この方法では、ポインタの算術演算と論理的な比較を続けることができます – 0xSina