为什么两个自定义对象以完全相同的方式定义不相等?

时间:2011-12-13 12:46:20

标签: objective-c cocoa

请看一下这段代码:

Card  *first = [[Card alloc] initWithFace:@"Ace" andSuit:@"Hearts"];
Card *second = [[Card alloc] initWithFace:@"Ace" andSuit:@"Hearts"];

if ([first isEqual:second])
    NSLog(@"Equal");
else
    NSLog(@"Not equal"); //WHY???

NSLog告诉我这两个对象不相等。但为什么?我应该怎么做才能使它们平等?

3 个答案:

答案 0 :(得分:14)

您必须在Card类中实现自己的isEqual:方法。

这会将传入的卡片对象的面部和套装与self进行比较,并返回适当的BOOL值。有关基础(NSObject)实现以及如何修改它的更多详细信息,请参阅here

未经测试的,键入的浏览器实现类似于:

-(BOOL)isEqual:(id)compareObject
{
    if (self == compareObject)
        return YES;

    if (![compareObject isKindOfClass:[self class])
        return NO;

    Card *compareCard = (Card*)compareObject;
    if ([compareCard.face isEqualToString:self.face] && [compareCard.suit isEqualToString:self.suit])
        return YES;
    else
        return NO;
}

您还必须实现hash,以便两个相等的对象返回相同的哈希值。

答案 1 :(得分:3)

我写这个作为另一个问题的答案,但它很好地回答了你的问题:


Objective-C中的

==检查身份。这是两个指针是否指向同一个对象。

测试平等使用:[objectA isEqual:objectB]。默认情况下,它与==相同,但可以覆盖它以使其具有自定义相等性。

答案 2 :(得分:0)

“isEqual”的意思是“它们是同一个物体吗?”,它们不是。你想测试“他们有相同的价值吗?”。