您如何isEqual:在 Objective-C 中正确覆盖?“捕获”似乎是,如果两个对象相等(由isEqual:方法确定),它们必须具有相同的哈希值。
Cocoa Fundamentals Guide的Introspection部分确实有一个关于如何覆盖的示例,复制如下,用于名为 的类: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;
}
它检查指针相等,然后是类相等,最后使用 比较对象isEqualToWidget:,它只检查nameanddata属性。该示例未显示的是如何覆盖hash.
让我们假设还有其他不影响相等性的属性,比如age。不应该hash重写该方法以便仅name影响data散列吗?如果是这样,你会怎么做?只需添加和的哈希name值data?例如:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash += [[self name] hash];
hash += [[self data] hash];
return hash;
}
这足够了吗?有没有更好的技术?如果你有原语怎么办,比如int?将它们转换NSNumber为获取它们的哈希?或类似的结构NSRect?
(Brain fart:最初将它们与|=. 一起写为“按位或”。意思是添加。)