2012-09-11 29 views
6

Objective-Cの新しいリテラルが本当に好きです。私は新しい追加があれば数字を比較する良い方法があるのだろうかと思っています。例えばNSNumberリテラルの比較

、私はabを比較したい場合:

a = @1; 
b = @2; 

は、このようにそれらを比較するための唯一の方法です:

[a intValue] > [b intValue] 

以上、よりエレガントな、解決策がありますか?

+0

もしあなたが '[a greaterThan:b]'や '[a equalTo:b]'のようなメソッドを追加するカテゴリを書くことができます – pasawaya

+0

オペレータのコンパイラの書き換えが最終的にこの数値リテラルの拡張として現れる可能性があります構文。 '' @ NSNumber numberWithInt:1 ''になっています。 '@ 1 isGreaterThan:@ 2 'のように' @ 1> @ 2 'を許可したり書き換えたりすることはできません。混乱の可能性を除いて:「私は '(1> @ 2)'をしないのはなぜですか?」)。 –

+0

確かに、低レベルのポインタ比較を取り除くだろうが、いつも@ 1 @> = @ 2のようなことをしてからNSNumberにgreaterThanOrEqualToを実装することができるので、[@ 1 greaterThanOrEqualTo: @ 2] ...この方法では、ポインタの算術演算と論理的な比較を続けることができます – 0xSina

答えて

13

は平等性チェックのために、あなたは(後者はcompareを使用して)チェックisEqualToNumberを使用することができると言うことができます。

if ([a isEqualToNumber:b])     // if a == b 

わからないなぜを彼ら以下のcompareメソッドが少し不器用なように思われるので、isGreaterThanNumberisLessThanNumberの便利なメソッド(および可能であれば>=<=も実装していません)。

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オプションよりも好ましいかどうかは、自分で判断する必要があります。

+0

私にとっては速すぎます! :D – Zhang

+0

おそらく 'isEqualToNumber:'メソッドは 'isEqualToString:'のような他の多くの場所で使われているので、おそらく 'isEqualToNumber:'だけが追加されています。ただIMHO。 – Mazyod

+0

おかげさま...比較について知りませんでしたが、まだ分かりません> =または<= ....彼らが@ 1 == @ 2をやったならもっと素晴らしいでしょう...しかし、私は理解しません。 。 – 0xSina

7

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; 
} 
0

のNSNumberもisEqualToNumberがあります。ここでは

0

は良い働くチェックするコードスニペットです:

NSLog(@"%d", number1 == number2); 
NSLog(@"%d", [number1 isEqual:number2]); 
NSLog(@"%d", [number1 isEqualToNumber:number2]); 

出力:

1 
1 
1 

結論:

比較を理解するには、インスタンスの割り当てを理解する必要があります。NSNumberは内部的に割り当てられたオブジェクトのキャッシュを実装し、値を使用して既存のオブジェクトを新しく作成されたオブジェクトにマッピングします。値1を保持している既存のNSNumberオブジェクトが見つかった場合、新しいNSNumberインスタンスは作成されません。

関連する問題