你如何isEqual:在Objective-C中正确覆盖?"catch"似乎是如果两个对象相等(由isEqual:方法确定),它们必须具有相同的散列值.
" 可可基础指南"的 " 内省"部分确实有一个示例,说明如何为名为的类重写,如下所示:isEqual:MyWidget
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
Run Code Online (Sandbox Code Playgroud)
它检查指针相等性,然后检查类相等性,最后比较使用的对象isEqualToWidget:,它只检查name和data属性.该示例未显示的是如何覆盖hash.
比方说,让我们假设有其他属性不会影响平等age.如果没有hash方法被覆盖,使得只有name和data影响哈希?如果是这样,你会怎么做?只需添加的哈希 …
我有一个从Web服务中提取的对象列表.当我更新我的UITableView时,我再次从Web服务检索对象,并将它们相互比较以确保相等.然后我删除那些不存在的,并插入新对象,然后更新我的UITableView.如何测试新对象是否等于旧对象?为了清晰起见,我创建了一个测试..
requestA应该等于requestC,但是失败了.
这可能不用查看每个属性值,因为对象有很多值吗?
我最初只是在比较ID,但这不起作用,因为有时其他属性值会发生变化且ID保持不变.
Request *requestA = [[Request alloc] init];
Request *requestB = [[Request alloc] init];
Request *requestC = [[Request alloc] init];
requestA.requestID = @"1";
requestA.productName = @"Clutch";
requestB.requestID = @"2";
requestB.productName = @"Wiper";
requestC.requestID = @"1";
requestC.productName = @"Clutch";
if (requestA == requestB)
NSLog(@"A == B");
if (requestA == requestC)
NSLog(@"A == C");
if ([requestA isEqual:requestB])
NSLog(@"A isEqual B");
if ([requestA isEqual:requestC])
NSLog(@"A isEqual C");
// Look at the pointers:
NSLog(@"%p", requestA);
NSLog(@"%p", requestB);
NSLog(@"%p", requestC);
Run Code Online (Sandbox Code Playgroud)