6

私は、Objective-C の新しいリテラルがとても気に入っています。新しい追加により、数値を比較するためのより良い方法があるかどうか疑問に思っています.

たとえば、 と を比較aしたい場合b:

a = @1;
b = @2;

次のようにそれらを比較する唯一の方法です。

[a intValue] > [b intValue]

または、より優れた、よりエレガントなソリューションはありますか?

4

4 に答える 4

13

同等性チェックのisEqualToNumber場合、 または のいずれかが等しいかどうかをチェックするid(後者は を使用compare)を使用できます。

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

以下のメソッドは少しぎこちないように見えるので、なぜ彼らが便利なメソッドを実装しなかったのか (そしておそらくisGreaterThanNumber同様に)もわかりません。isLessThanNumber>=<=compare

不等式チェックの場合は、compare直接使用します (以下の最初のものからわかるように、等式に対してもこれを行うことができます)。

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 クラスのドキュメント ページを参照してください。


たとえば、次のようなコードを許可する独自のヘルパー関数を作成することを妨げるものは何もないことに注意してください。

if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no)

また:

if (nsnComp2 (a, b) >= 0)  ... // returns -1/0/+1

それはObjective-CではなくCです:-)それは、「エレガント」の定義が主に効率性または可読性によって拘束されるかどうかによって異なります。それがあなたの選択肢よりも好ましいかどうかintValueは、あなた自身が決定する必要があります.

于 2012-09-11T01:59:57.277 に答える
7

NSNumber実装-compare:します (他の多くのクラスと同様)。だからあなたは言うことができます

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;
}
于 2012-09-11T01:57:15.907 に答える
0

NSNumber には isEqualToNumber もあります。

于 2012-09-11T02:00:02.100 に答える
0

以下は、どちらが適切に機能するかを確認するためのコード スニペットです。

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

出力:

1
1
1

結論:

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

于 2016-07-08T10:23:50.537 に答える