2011-12-13 93 views
2

请在这个代码看看:为什么两个自定义对象的定义方式完全相同?

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告诉我这两个对象是不相等的。但为什么?我该怎么做才能让他们平等呢?

回答

14

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

这会比较传入的卡片对象的面部和花色,并返回相应的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两个相等的对象返回相同的哈希值。

3

我写这作为回答另一个问题,但它回答你相当不错:


在Objective-C检查==身份。那就是两个指针是否指向同一个对象。

为了测试平等使用:[objectA isEqual:objectB]。默认情况下,它的作用与==相同,但可以重写为自定义相等。

+0

I DO USE isEqual!它不起作用 –

+0

阅读开始的位:“默认情况下...” –

+0

哦,你是对的,对不起我的注意力不集中 –

0

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