Ios 使用混合数据类型的属性重写isEqual和Hash

Ios 使用混合数据类型的属性重写isEqual和Hash,ios,objective-c,hash,equality,nsobject,Ios,Objective C,Hash,Equality,Nsobject,我有一个自定义类,我试图检查该类的两个对象是否相等。我尝试使用isEqual和“==”方法来测试它,但即使对象相同,两者都返回false 假设我有一个名为MyClass的类,它有一些属性: MyClass.h 我的班级 问题: 这在哈希方法上引发错误的接收器类型“Color”错误。我猜这是因为我想用一个整数对字符串进行异或运算?我的哈希逻辑正确吗?如何创建字符串和整数的散列 解决方案: 我能找出问题所在。以下是解决方案: - (NSUInteger)hash { retu

我有一个自定义类,我试图检查该类的两个对象是否相等。我尝试使用isEqual和“==”方法来测试它,但即使对象相同,两者都返回false

假设我有一个名为MyClass的类,它有一些属性:

MyClass.h

我的班级

问题: 这在哈希方法上引发错误的接收器类型“Color”错误。我猜这是因为我想用一个整数对字符串进行异或运算?我的哈希逻辑正确吗?如何创建字符串和整数的散列

解决方案:

我能找出问题所在。以下是解决方案:

- (NSUInteger)hash
    {
        return [self.name hash] ^ [[NSNumber numberWithInt:self.color] hash] ^ [[NSNumber numberWithInt:self.model] hash];
    }

好吧,我知道问题出在哪里了。解决方案:[self.name散列]^[[NSNumber numberwhithint:self.color]散列]^[[NSNumber numberwhithint:self.model]散列];巨大的杀伤力。只需使用[self.name hash]。您不必在散列中包含所有内容。XOR-ing不是一个好的解决方案。使用return 31*31*[self.name散列]+31*[[NSNumber numberwhithint:self.color]散列]+[[NSNumber numberwhithint:self.model]散列];为了更好的散列分布`如果要包含所有内容,为什么不放弃使用NSNumber,直接使用原始枚举值?@rmaddy-简单使用原始枚举值是什么意思?我尝试了[self.color hash],但发现了错误。你能举个例子吗?
@implementation MyClass
- (id)init
{
    self = [super init];
    if (self)
    {
        self.color = White;
        self.model = ModelA;
    }
    return self;
}

- (BOOL)isEqual:(NSObject *)object
{
    MyClass *filter = (MyClass *)object;
    return [self.name isEqualToString:object.name] && self.color == object.color &&
           self.model == object.model;
}

- (NSUInteger)hash
{
    return [self.name hash] ^ [self.color hash] ^ [self.model hash];
}

@end
- (NSUInteger)hash
    {
        return [self.name hash] ^ [[NSNumber numberWithInt:self.color] hash] ^ [[NSNumber numberWithInt:self.model] hash];
    }