比较isEqual中的nil属性

时间:2013-08-03 14:05:33

标签: objective-c cocoa nsstring equality nsnumber

修改

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

结束编辑

我希望我的自定义类的对象在YES的所有属性与作为参数传递的对象的属性相同时返回isEqual。这应该包括属性都是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发送给nil。

对于BOOL我认为这不是必要的,因为BOOL不能nil - 对于布尔人来说,==就足够了吗?

我缺少什么,或者有什么方法可以改善这个?

3 个答案:

答案 0 :(得分:5)

既然你不能(好吧,这不是一个好主意)覆盖包括nil在内的所有对象类型的isEquals,那么显而易见的选择就是在你需要的时候创建一个单独的简单函数; < / p>

BOOL nilEqual(id a, id b)
{
    return (a == nil && b == nil) || [a isEqual:b];
}

答案 1 :(得分:1)

看起来我找到了比https://stackoverflow.com/a/18033891/440168更简单,更优化的解决方案:

BOOL nilEqual(id a, id b)
{
    return (a == b) || [a isEqual:b];
}

答案 2 :(得分:0)

nil无法调用isEqual,因为它是......没有问题。它不知道要调用哪个isEqual。它不是一个对象。我不知道有办法做到这一点,并怀疑有没有了(有人请你纠正我,我很乐意看到这个实现)。

话虽这么说,通常你需要在调用isEqual之前检查nil指针所以:

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

这会给你你想要的东西,你可以很容易地创建一个块(或者一个宏),所以你不必每次都输出这个。