【问题标题】:How to implement equality based on property values?如何实现基于属性值的相等?
【发布时间】:2012-06-27 09:24:57
【问题描述】:

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

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

【问题讨论】:

  • 对我来说似乎过于复杂。我认为#define 解决方案实际上非常顺利:)

标签: objective-c equality


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多