gpt4 book ai didi

iphone - 帮助 isEquals 和 hash in iphone

转载 作者:太空狗 更新时间:2023-10-30 03:54:22 26 4
gpt4 key购买 nike

所以我重写了 isEqualshash 来比较自定义对象,以便能够从 NSArray 中删除重复项。问题是我在不包含重复项的列表中遗漏了一些值,而且我的 hashisEquals 实现似乎是错误的。自定义对象是一个 Course 对象,它有一些变量,例如:idname 我将把代码放在这里:

- (BOOL)isEqual:(id)object {
if ([object isKindOfClass:[Course self]]) {
return YES;
}
if(self == object){
return YES;
}
else {
return NO;
}
}

- (unsigned)hash {

NSString *idHash = [NSString stringWithFormat: @"%d", self._id];
return [idHash hash];
}

然后,在查询数据库之后,我将值放入一个数组中,然后放入一个集合中,该集合应该像这样删除重复的项目:

NSMutableSet *noDuplicates = [[NSMutableSet alloc] initWithArray:tempResults];

你能看出我在 isEqualshash 实现中做错了什么吗?

非常感谢。

最佳答案

第 1 步。确定使用哪些实例变量/状态来确定相等性。确保它们存在属性是个好主意(如果您愿意,它们可以是在 class extension 中声明的私有(private)属性)。

第 2 步。根据这些实例变量编写哈希函数。如果所有重要的属性都是对象,您可以将它们的哈希值异或在一起。您也可以直接使用 C 整数等。

步骤 3. 编写 isEqual: 通常的模式可能是首先测试两个对象是否在定义了 isEqual: 的方法的类或子类中然后测试所有属性的相等性。

因此,如果一个类 Person 有一个名称属性(NSString 类型)和一个数字属性(int 类型),它们一起定义了一个唯一的人,hash 可能是:

-(NSUInteger) hash
{
return [[self name] hash] ^ [self number];
}

isEqual: 可能是

-(BOOL) isEqual: (id) rhs
{
BOOL ret = NO;
if ([rhs isKindOfClass: [Person class]]) // do not use [self class]
{
ret = [[self name] isEqualToString: [rhs name]] && [self number] == [rhs number];
}
return ret;
}

我不认为它在文档中被列为明确要求,但可能假设相等性是对称的和可传递的,即

  • [a isEqual: b] == [b isEqual: a] 对于所有 a 和 b
  • [a isEqual: b] && [b isEqual: c]对所有 a、b、c 暗示 [a isEqual: c]

因此,如果您为子类重写 isEqual: 时必须小心,以确保它可以双向工作。这也是为什么注释,不要使用上面的[self class]

关于iphone - 帮助 isEquals 和 hash in iphone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com