0

Objective-cで2つのオブジェクトを比較しようとすると、IOS 6の時点では、==(以下の証明)などの通常の演算子を使用できると思いますが、これがどのように行われるかを知りたいです。 -compareメソッド。

私の知る限り、compareメソッドは次のように機能します。

if ([objOne compare:objTwo] == NSOrderedAscending){
    // objOne is greater

まず第一に、それは正しいですか?そして第二に、他の比較方法、すなわち、NSOrderedAscendingは何ですか?

ここに画像の説明を入力してください

4

1 に答える 1

7

クラスの作成者は比較する責任があります。つまり、2つのオブジェクトがいつ等しいかを定義する必要があります。

これはcompare:、NSOrderedAscending、NSOrderedDescending、NSOrderedSameのいずれかを返すメソッドを定義することによって行われます。

ドキュメントから

NSComparisonResult

これらの定数は、リクエスト内のアイテムの順序を示すために使用されます。

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

これらのNSComparisionResultsを返す他のメソッドを作成することを妨げるものは何もないことに注意してください。iENSStringにcompare:caseInsensitiveCompare:

==同一性をチェックするだけです。ポインタが同じである場合、これはtrueを返しますが、異なるオブジェクトが存在するが、同じプロパティのメニングで同じである場合は、falseを返します。


NSComparisonMethodsプロトコルリファレンスから

NSObjectによってこれらのメソッドの多くに提供されるデフォルトの実装は、セレクター、署名、および説明が以下に一致する単一の比較メソッドを実装するオブジェクトに適しています。

- (NSComparisonResult)compare:(id)object;

このメソッドは、レシーバーがオブジェクトより小さい場合はNSOrderedAscendingを返し、レシーバーがオブジェクトより大きい場合はNSOrderedDescendingを返し、レシーバーとオブジェクトが等しい場合はNSOrderedSameを返す必要があります。たとえば、NSStringは、この非公式プロトコルで宣言されたメソッドのほとんどを実装していませんが、NSStringは必要な要件を満たすcompare:メソッドを実装しているため、NSStringオブジェクトはこのプロトコルに準拠するメッセージを適切に処理します。Cocoaには、NSDate、NSDecimalNumber、およびNSValueクラスの適切なcompare:メソッド実装も含まれています。

つまり、-compare:メソッドを指定した場合は、を使用することもできます-isEqual:

if ([objOne isEqual:objTwo]){ //…

ここに画像の説明を入力してください

于 2013-02-26T19:57:21.307 に答える