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 : 元々は「bitwise OR」を と一緒に書きました|=
。加算を意味します。)