isEqual:
Objective-C에서 어떻게 올바르게 재정의 합니까? "캐치"는 두 개의 객체가 동일한 경우 ( 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:
만 검사하는를 사용하여 객체를 비교합니다 . 예제에서 보이지 않는 것은 override하는 방법 입니다.name
data
hash
평등에 영향을 미치지 않는 다른 속성이 있다고 가정 해 봅시다 age
. 안 hash
메소드는 그런 오버라이드 (override) 할 수 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"과 함께 썼습니다 |=
. Meant add.)
if (![other isKindOfClass:[self class]])
-이것은 기술적으로 평등이 Commutative가 아님을 의미합니다. 즉 A = B는 B = A를 의미하지 않습니다 (예 : 하나가 다른 클래스의 하위 클래스 인 경우)