您如何isEqual:
在Objective-C中正确覆盖?“捕获”似乎是如果两个对象相等(由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;
}
它先检查指针是否相等,然后再检查类是否相等,最后使用来比较对象isEqualToWidget:
,后者仅检查name
和data
属性。该示例未显示的是如何重写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
?
(“ 大脑放屁”:最初将它们与一起写成“按位或” |=
。
if (![other isKindOfClass:[self class]])
-从技术上讲,这意味着平等不会是可交换的。即A = B并不意味着B = A(例如,如果一个是另一个的子类)