2012-06-27 36 views
2

我爲自定義班級實施-isEqual:。平等基於屬性值,即。如果所有屬性都相同,則認爲這些對象是相等的。再加上傳統的階級檢查代碼如下所示:如何基於屬性值實現相等性?

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

但失敗了nil屬性值,即。存儲在someProperty中的nil值中的兩個對象被認爲是不相等的,但我希望它們相等。因此,我到了以下版本:

- (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

_Seems對我來說過於複雜__我認爲'#define'解決方案實際上非常流暢:) – Anne

回答

2

isEqual:是非常對象特定的。這是一種語義平等。您可以爲每個班級定義什麼是平等的。因此沒有標準的方法來做到這一點。

最簡單的實現是return self == object,你的第二個實現非常通用且很好,但不一定非常適合每個類。舉例來說,對於Person,比較電子郵件可能就足夠了,或者如果您設想某個電子郵件可能會被多個家庭成員使用,則可以是電子郵件和名字。