isEqual:
Objective-Cではどのように適切にオーバーライドしますか?「キャッチ」は、2つのオブジェクトが等しい場合(isEqual:
メソッドによって決定される)、それらは同じハッシュ値を持つ必要があるようです。
Cocoa Fundamentals GuideのIntrospectionセクションには、オーバーライドする方法の例があり、次のようにコピーされます。isEqual:
MyWidget
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
ポインタの等価性をチェックし、次にクラスの等価性をチェックし、最後isEqualToWidget:
にname
とdata
プロパティをチェックするだけを使用してオブジェクトを比較します。例に示されていないのは、オーバーライドする方法hash
です。
たとえば、平等に影響を与えないプロパティが他にもあるとしましょうage
。すべきではないhash
方法が唯一のよう上書きすることname
やdata
ハッシュに影響を与えますか?もしそうなら、あなたはそれをどのように行いますか?ただのハッシュを追加するname
とdata
?例えば:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash += [[self name] hash];
hash += [[self data] hash];
return hash;
}
それで十分ですか?より良いテクニックはありますか?あなたがのようなプリミティブを持っている場合はどうなりますint
か?それらを変換しNSNumber
てハッシュを取得しますか?または構造体NSRect
?
(Brain fart:もともとは「ビット単位OR」と一緒に|=
。Meant add と一緒に書いたものです。)
if (![other isKindOfClass:[self class]])
-これは技術的には、平等は可換ではないことを意味します。つまり、A = BはB = Aを意味しません(たとえば、一方が他方のサブクラスである場合)