为什么两个自定义对象的定义方式完全相同?
问题描述:
请在这个代码看看:为什么两个自定义对象的定义方式完全相同?
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告诉我这两个对象是不相等的。但为什么?我该怎么做才能让他们平等呢?
答
您必须在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
两个相等的对象返回相同的哈希值。
答
我写这作为回答另一个问题,但它回答你相当不错:
在Objective-C检查==
身份。那就是两个指针是否指向同一个对象。
为了测试平等使用:[objectA isEqual:objectB]
。默认情况下,它的作用与==
相同,但可以重写为自定义相等。
答
“isEqual”的意思是“他们是同一个对象吗?”,他们不是。你想测试“他们有相同的价值吗?”。
I DO USE isEqual!它不起作用 –
阅读开始的位:“默认情况下...” –
哦,你是对的,对不起我的注意力不集中 –