相关疑难解决方法(0)

覆盖isEqual:和hash的最佳实践

你如何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:,它只检查namedata属性.该示例显示的是如何覆盖hash.

比方说,让我们假设有其他属性不会影响平等age.如果没有hash方法被覆盖,使得只有namedata影响哈希?如果是这样,你会怎么做?只需添加的哈希 …

equality objective-c

266
推荐指数
11
解决办法
9万
查看次数

41
推荐指数
2
解决办法
8740
查看次数

在可变Cocoa对象上实现-hash的技术

-hash当一个可变对象存储在一个集合中时,它的文档说不能改变,类似地-isEqual:说,-hash对于相同的对象,值的文档必须相同.

鉴于此,是否有人对最佳实施方式有任何建议-hash,使其满足这两个条件但实际上是智能计算的(即不仅仅是返回0)?有谁知道框架提供的类的可变版本如何做到这一点?

最简单的事情当然是忘记第一个条件(关于它不会改变),并确保我不会在一个集合中偶然改变一个对象,但我想知道是否有任何更灵活的解决方案.

编辑:我想知道在我改变对象的内部状态时是否可以维护2个契约(其中相等的对象具有相等的哈希值,并且当对象在集合中时哈希值不会改变).我倾向于说"不",除非我做了一些愚蠢的事情,总是为哈希返回0,但这就是我问这个问题的原因.

hash cocoa cocoa-touch objective-c

12
推荐指数
1
解决办法
2226
查看次数

推荐的哈希函数用于覆盖NSObject的哈希方法

在自定义类中覆盖NSObject的哈希方法有什么好的哈希函数?

hash cocoa objective-c

5
推荐指数
1
解决办法
7187
查看次数

在iphone中帮助isEquals和hash

所以我重写isEqualshash比较自定义对象,以便能够删除重复项NSArray.问题是我在列表中缺少一些不包含重复项的值,而且我的hashisEquals实现似乎是错误的.自定义对象是具有像一些变量课程目标: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];
}
Run Code Online (Sandbox Code Playgroud)

然后,在查询数据库之后,我将值放在一个数组中,然后放在一个应该删除重复项的集合中,如下所示:

NSMutableSet *noDuplicates = [[NSMutableSet alloc] initWithArray:tempResults];
Run Code Online (Sandbox Code Playgroud)

你可以看到我在做错了isEqualshash执行?

非常感谢.

iphone hash objective-c

5
推荐指数
2
解决办法
2597
查看次数

标签 统计

objective-c ×5

cocoa ×3

hash ×3

cocoa-touch ×1

equality ×1

iphone ×1

methods ×1