オブジェクトの比較
オブジェクトの比較は、それが本質的に他のオブジェクトと同じであるかどうかを決定するオブジェクトの能力を指します。1つのオブジェクトが、オブジェクトの1つに isEqual: メッセージを送信することにより、別のオブジェクトに入る事によって、他の物と等しいかどうか確かめます。オブジェクトが等しい場合は、YES を受け取ります。それらが等しくない場合は、NO を受け取ります。各クラスは、クラス固有の比較ロジックを実装することで、そのインスタンスが等しいかどうかを判断します。ルートクラス、NSObject は、単純なポインタの比較によって、等しいかどうかを測定します。他の極端な例では、カスタムクラスの等しいかどうかの決定要因は、クラスのメンバーシップに加えて、すべてのカプセル化された値です。
Foundation フレームワークの一部のクラスは、isEqualToType: 形式の比較メソッドを実装しています、例えば、isEqualToString: と isEqualToArray:。これらのメソッドは、与えられたクラス·タイプに固有の比較を行います。
比較するメソッドは、実行時にオブジェクトがどのような事をするのか、決定するのに役立つ欠かせないコーディングツールです。NSArray と NSDictionary のようなコレクションクラスは、広範囲にそれらを使用しています。
比較ロジックを実装する
サブクラスに固有の比較ロジックを追加し、カスタムサブクラスのインスタンスを比較することが予想される場合、isEqual: メソッドを上書きして下さい。あなたのクラスは、例えば、等しいかどうかのスーパークラスの決定を受け入れましたが、さらにテストを追加することができます。あなたのクラスには、その値が、クラスの2つのインスタンスが等しいと考えられる前に等しくあるべき1つ以上のインスタンス変数を持つことができます。isEqual: の以下の実装は、クラス固有のもの(name プロパティ)が1で終わる、一連のチェックを実行します。
- (BOOL)isEqual:(id)other { if (other == self) return YES; if (![super isEqual:other]) return NO; return [[self name] isEqualToString:[other name]]; // class-specific }
もしあなたが isEqual: を上書きする場合、あなたはまた、ハッシュテーブル構造体のテーブルアドレスとして使用できる整数を生成して返すように hash メソッドを実装する必要があります。isEqual: が、2つのオブジェクトを等しいと判断した場合、それらは同じハッシュ値を持つ必要があります。
前提条件の記事
関連記事
既出の議論
(なし)
次の章
前の章