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);
}

这似乎工作正常。这是解决平等的“标准”方式吗?对我来说似乎过于复杂。

4

1 回答 1

2

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

最简单的实现是return self == object,您的第二个实现非常通用且不错,但不一定适合每个类。例如,对于 a Person,比较电子邮件可能就足够了,或者如果您认为电子邮件可以被多个家庭成员使用,则比较电子邮件和名字。

于 2012-06-27T09:37:50.633 回答