私は、Objective-C の新しいリテラルがとても気に入っています。新しい追加により、数値を比較するためのより良い方法があるかどうか疑問に思っています.
たとえば、 と を比較a
したい場合b
:
a = @1;
b = @2;
次のようにそれらを比較する唯一の方法です。
[a intValue] > [b intValue]
または、より優れた、よりエレガントなソリューションはありますか?
私は、Objective-C の新しいリテラルがとても気に入っています。新しい追加により、数値を比較するためのより良い方法があるかどうか疑問に思っています.
たとえば、 と を比較a
したい場合b
:
a = @1;
b = @2;
次のようにそれらを比較する唯一の方法です。
[a intValue] > [b intValue]
または、より優れた、よりエレガントなソリューションはありますか?
同等性チェックの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
は、あなた自身が決定する必要があります.
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;
}
NSNumber には isEqualToNumber もあります。
以下は、どちらが適切に機能するかを確認するためのコード スニペットです。
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
出力:
1
1
1
結論:
比較を理解するには、インスタンスの割り当てを理解する必要があります。NSNumber は、割り当てられたオブジェクトのキャッシュを内部的に実装し、値を使用して既存のオブジェクトを新しく作成されたオブジェクトにマップします。値 1 を保持している既存の NSNumber オブジェクトが見つかった場合、新しい NSNumber インスタンスは作成されません。