Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 等质量条件下nil性质的比较_Objective C_Cocoa_Nsstring_Equality_Nsnumber - Fatal编程技术网

Objective c 等质量条件下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 {

编辑

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

结束编辑

我希望自定义类的对象返回
YES
for
isEqual
,只要它的所有属性与作为参数传递的对象的属性相同。这应该包括属性均为
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];
}