码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-10-13 00:32:36      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:tom   rpe   eset   需求   UI   可变对象   init   return   特定   

在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怎么比较两个对象的相等?

标签:tom   rpe   eset   需求   UI   可变对象   init   return   特定   

原文地址:http://www.cnblogs.com/gkp307/p/7658586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!