3

编辑

从最初的答案来看,我还不够清楚。我只想检查我自己的自定义类的对象之间的相等性,结果取决于它的属性(我相信很标准)?我正在努力解决的问题是确保当两个实例的属性都为零时,该属性被视为相等。

结束编辑

我希望自定义类的对象在其所有属性与作为参数传递的对象的属性相同时返回YESisEqual这应该包括两个属性都是nil. 我最近了解到[nil isEqual:nil]退货NO

下面的实现会实现我想要的吗?

- (BOOL)isEqual:(id)object
    {
       if (object == self)
            return YES;
        if (!object || ![object isKindOfClass:[self class]])
            return NO;

        return (
            (!object.numberProperty && !self.numberProperty) || (object.numberProperty && self.numberProperty && [object.numberProperty isEqualToNumber:self.numberProperty])
            &&
            (!object.stringProperty && !self.stringProperty) || object.stringProperty && self.stringProperty && [object.stringProperty isEqualToNumber:self.stringProperty])
        ...etc
        );
    }

我试图YES在两个属性都返回nil并且避免发送isEqualToNumberisEqualToString为零时返回。

对于BOOLs 我猜这是没有必要的,因为 aBOOL不可能nil- 一个简单==的布尔值就足够了吗?

我遗漏了什么,或者有什么方法可以改善这一点?

4

3 回答 3

5

由于您不能(好吧,这不是一个好主意)覆盖所有对象类型的 isEquals ,包括nil,显而易见的选择是在您需要的时候创建一个单独的简单函数;

BOOL nilEqual(id a, id b)
{
    return (a == nil && b == nil) || [a isEqual:b];
}
于 2013-08-03T14:31:15.993 回答
1

看起来我发现比https://stackoverflow.com/a/18033891/440168更简单、更优化的解决方案:

BOOL nilEqual(id a, id b)
{
    return (a == b) || [a isEqual:b];
}
于 2016-08-18T13:32:14.343 回答
0

nil不能打电话isEqual,因为它是......好吧,没有。它不知道该isEqual调用哪个。它不是一个对象。我不知道如何做到这一点并且怀疑是否存在(请有人纠正我,我很想看到一个实现)。

话虽如此,通常您需要在调用之前检查 nil 指针isEqual

if ((!someObject && !otherObject) || [someObject isEqual:otherObject]);

这将为您提供所需的内容,并且您可以轻松创建一个块(或者可能是一个宏),因此您不必每次都输入它。

于 2013-08-03T14:26:27.967 回答