iOS怎么比较两个对象的相等?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS怎么比较两个对象的相等?相关的知识,希望对你有一定的参考价值。

ios中如果使用==来比较两个对象,比较的是对象的内存地址,一般不能满足我们的需求。

例如有一个Person类,当Person对象的所有属性都一致时,就认为这两个对象相等,可以按照下面的方法实现。

@interface Person: NSObject

@property (nonatomic, copy)NSString *name;

@property (nonatomic, copy)NSString *country;

@property (nonatomic, copy)NSString *pId;

@end

 

@implementation Person

- (BOOL)isEqual:(id)object {

  if (self == object) {

    return YES;

  }

  

  if ([self class] != [object class]){

    return NO;

  }

 

  Person *anotherPerson = (Person *)object;

  if (![_name isEqualToString:anotherPerson.name]){

    return NO;

  }

  if (![_country isEqualToString:anotherPerson.country]){

    return NO;

  }

  if (![_pId isEqualToString:anotherPerson.pId]){

    return NO;

  }

  return YES;

}

 

- (NSUInteger)hash {

  NSUInteger nameHash = [_name hash];

  NSUInteger countryHash = [_country hash];

  NSUInteger pIdHash = [_pId hash];

  return  nameHash ^  countryHash ^ pIdHash;

}

@end

这样基本上就满足需求了。

同样的,我们可以实现一个特定的相等判断方法,类似于NSString类的isEqualToString方法,可以按照下面的方式实现。

@implementation Person

 

- (BOOL)isEqualToPerson:(Person *)anotherPerson {

  if (self == anotherPerson) {

    return YES;

  }

  if (![_name isEqualToString:anotherPerson.name]){

    return NO;

  }

  if (![_country isEqualToString:anotherPerson.country]){

    return NO;

  }

  if (![_pId isEqualToString:anotherPerson.pId]){

    return NO;

  }

  return YES;

}

 

- (BOOL)isEqual:(id)object {

  if ([self class] == [object class]){

    return [self isEqualToPerson:(Person *)object];

  }else{

    return [super isEqual:object];

  }

}

 

- (NSUInteger)hash {

  NSUInteger nameHash = [_name hash];

  NSUInteger countryHash = [_country hash];

  NSUInteger pIdHash = [_pId hash];

  return  nameHash ^  countryHash ^ pIdHash;

}

@end

 

注意:相同的对象必须具有相同的哈希码,但是两个哈希码相同的对象不一定相同。

 

另外,使用容器时,如果往容器中放入可变对象,不应该再改变其哈希码。

例如:

NSMutableSet *set = [[NSMutableSet alloc] init];

NSMutableArray *arrayA = [@[@1, @2]  mutableCopy];

[set addObject:arrayA];

NSLog(@"%@", set);     //{( (1,2) )}

 

NSMutableArray *arrayB = [@[@1]  mutableCopy];

[set addObject:arrayB];

NSLog(@"%@", set);     //{(  (1), (1,2) )}

 

[arrayB addObject:@2];

NSLog(@"%@", set);     //{(  (1,2), (1,2) )}

//神奇的在set中放入了两个相等的数组。有时候会产生一些意料之外的问题,这个需要特别注意。

 

以上是关于iOS怎么比较两个对象的相等?的主要内容,如果未能解决你的问题,请参考以下文章

java怎么比较两个对象是不是相等?

js 如何比较两个对象相等

c# 比较两个对象的值是不是相等

java中如何判断两个变量相等

怎么比较两个枚举类型是不是相等

判断两个数组是不是相等