修改
从最初的答案来看,我不够清楚。我只是想检查我自己的自定义类的对象之间的相等性,结果取决于它的属性(我相信很标准)?我正在努力的一点是确保当两个实例的属性都为零时,属性被视为相等。
结束编辑
我希望我的自定义类的对象在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
,同时避免将isEqualToNumber
或isEqualToString
发送给nil。
对于BOOL
我认为这不是必要的,因为BOOL
不能nil
- 对于布尔人来说,==
就足够了吗?
我缺少什么,或者有什么方法可以改善这个?
答案 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]);
这会给你你想要的东西,你可以很容易地创建一个块(或者一个宏),所以你不必每次都输出这个。