您如何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:
,它只检查name
anddata
属性。该示例未显示的是如何覆盖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:最初将它们与|=
. 一起写为“按位或”。意思是添加。)