Objective c 等质量条件下nil性质的比较
编辑 从最初的答案来看,我不够清楚。我只想检查我自己的自定义类的对象之间的相等性,结果取决于它的属性(我相信是相当标准的)?我正在努力解决的一点是,当两个实例的属性都为nil时,确保属性被视为相等的 结束编辑 我希望自定义类的对象返回Objective c 等质量条件下nil性质的比较,objective-c,cocoa,nsstring,equality,nsnumber,Objective C,Cocoa,Nsstring,Equality,Nsnumber,编辑 从最初的答案来看,我不够清楚。我只想检查我自己的自定义类的对象之间的相等性,结果取决于它的属性(我相信是相当标准的)?我正在努力解决的一点是,当两个实例的属性都为nil时,确保属性被视为相等的 结束编辑 我希望自定义类的对象返回YESforisEqual,只要它的所有属性与作为参数传递的对象的属性相同。这应该包括属性均为nil的情况。我最近了解到[nil isEqual:nil]返回否 下面的实现会实现我所期望的吗 - (BOOL)isEqual:(id)object {
YES
forisEqual
,只要它的所有属性与作为参数传递的对象的属性相同。这应该包括属性均为nil
的情况。我最近了解到[nil isEqual:nil]
返回否
下面的实现会实现我所期望的吗
- (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
);
}
当两个属性都为nil
时,我试图返回YES
,同时避免将isEqualToNumber
或isEqualToString
发送到nil
对于BOOL
s,我想这是不必要的,因为BOOL
不可能是nil
——一个简单的=
对布尔人来说就足够了吗
我缺少什么,或者有什么改进的方法吗?
nil
无法调用isEqual
,因为它是。。。嗯,没有。它不知道调用哪个isEqual
。它不是一个物体。我不知道有什么方法可以做到这一点,并且怀疑还有什么方法可以做到(请有人纠正我,我希望看到实现)
也就是说,在调用isEqual之前,通常需要检查nil指针,因此:
if ((!someObject && !otherObject) || [someObject isEqual:otherObject]);
这将为您提供所需的内容,并且您可以轻松创建块(或者宏),这样您就不必每次都键入此内容。因为您不能(好的,这不是一个好主意)覆盖所有对象类型的相等值,包括nil
,显而易见的选择是,只需为您需要的时间制作一个单独的简单函数
BOOL-nilEqual(id a、id b)
{
返回(a==nil&&b==nil)| |[a等质量:b];
}
看起来我找到了比以下更简单、更优化的解决方案:
那么,您想要一个像
[nil someEqualityTest:nil]
那样调用时返回YES
的方法吗除此之外,是的,BOOL
是一种基本类型,=
按预期工作。问题是让[nil isEqual:nil]
甚至调用您的isEqual
。不,我只是尝试检查[myObject isEqual:myObject],并在所有属性匹配时返回yes。我希望两个属性都为nil时是“匹配”。我试图比较对象的属性,而不是对象本身。这是不准确的。答案不仅仅是它包含的代码。被接受的答案在解释如何以及在何处使用这一点上做得更好,至少根据提问者的说法(并基于sunsequent Upvots)。@BenPackard我认为他们主要指的是你在第一次评论中表达的缺乏理解。尽管公认的解决方案在功能上是等效的,但似乎可以避免您怀疑答案是错误的。作为提问者,你完全有权接受你认为最好的解决方案。我认为在我的第一个评论中肯定缺乏理解。我还认为,部分原因在于答案之间存在细微差异。当然,这是几年前的事了,但我认为这是关于我的理解,这可以作为一种方法添加到对象中,这与我希望能够比较对象的方式最为相似,而不是你(功能相同)的建议。不管怎样,我想已经足够了。如果没有其他问题,那么在事实发生后这么长时间再回读你自己的问题太痛苦了:/那么如果a为零,b不是零,我将执行[nil isEqual:b]-可以吗?同样地,对于[等质量:零]?我想在每种情况下,我都不会得到预期的结果?@BenPackard这没关系,因为在NSObject上记录的是允许nil
。谢谢。最后一个问题-isEqual是否总是调用等价的isEqualTo*?我更喜欢使用isEqualToDate、isEqualToString(我喜欢它的清晰性)。但是我会像你建议的那样使用isEqual,如果它能根据接收者的类别做适当的事情。@BenPackard唯一的区别是苹果在大多数isEqualTo…
方法的文档中所说的,就像在NSString.isEqualToString<代码>特殊注意事项:当您知道两个对象都是字符串时,此方法比isEqual:。更快速地检查相等性。似乎是。谢谢。虽然(50%)类型检查很好。
BOOL nilEqual(id a, id b)
{
return (a == b) || [a isEqual:b];
}