Objective c 如何基于属性值实现相等?

Objective c 如何基于属性值实现相等?,objective-c,equality,Objective C,Equality,我正在为我的自定义类实现-isEqual:。相等性基于属性值,即如果所有属性相等,则认为对象相等。与传统的类检查一起,代码如下所示: - (BOOL) isEqual: (id) object { return [object class] == [self class] && [[object someProperty] isEqual:someProperty] && [[object otherProperty] is

我正在为我的自定义类实现
-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);
}

这似乎很有效。这是解决平等问题的“标准”方法吗?对我来说似乎过于复杂。

isEqual:
非常特定于对象。这是语义上的平等。由您为每个类定义isEqual的含义。因此,没有标准的方法来做到这一点

最简单的实现是
返回self==object
,您的第二个实现非常通用且很好,但不一定适合所有类。例如,对于一个
,比较电子邮件就足够了,或者如果你认为一封电子邮件可以被几个家庭成员使用,那么比较电子邮件和名字就足够了。

对我来说似乎太复杂了。我认为
#define
解决方案实际上相当顺利:)