2012-06-27 1 views
2

내 맞춤 클래스에 -isEqual:을 구현하고 있습니다. 평등은 속성 값, 즉 모든 속성이 같으면 객체는 동일하게 간주됩니다.속성 값을 기반으로 동등을 구현하는 방법은 무엇입니까?

- (BOOL) isEqual: (id) object 
{ 
    return [object class] == [self class] 
     && [[object someProperty] isEqual:someProperty] 
     && [[object otherProperty] isEqual:otherProperty]; 
} 

을하지만 이것은, nil 속성 값, 즉 실패 함께 기존의 클래스 검사와 코드는 다음과 같습니다. nil 값을 가진 클래스의 두 객체는 ​​someProperty에 저장되며, 평등하길 바란다. 그래서 나는 다음 버전에 도착했다 :

- (BOOL) isEqual: (id) object 
{ 
    #define equals(a, b) ((a == b) || ([a isEqual:b])) 
    return equals([object class], [self class]) 
     && equals([object someProperty], someProperty) 
     && equals([object otherProperty], otherProperty); 
} 

이것은 잘 작동하는 것처럼 보인다. 이것은 평등을 해결하는 "표준"방법입니까? 지나치게 복잡하게 보입니다.

+1

_ 지나치게 복잡하다. 나는'#define' 솔루션이 실제로 꽤 부드럽다고 생각한다. :) – Anne

답변

2

isEqual:은 객체마다 매우 다릅니다. 그것은 의미 론적 평등입니다. isEqual이 의미하는 것은 모든 클래스에 대해 정의하는 것은 당신에게 달려 있습니다. 따라서 표준 방법이 없습니다.

가장 간단한 구현은 return self == object입니다. 두 번째 구현은 매우 일반적이며 훌륭하지만 모든 클래스에 꼭 맞는 것은 아닙니다. 예를 들어, Person의 경우 전자 메일을 비교하는 것으로 충분할 수 있으며 여러 가족 구성원이 전자 메일을 사용할 수 있다고 가정 할 경우 전자 메일과 이름을 사용할 수 있습니다.