1. 程式人生 > >iOS怎麽比較兩個對象的相等?

iOS怎麽比較兩個對象的相等?

== array nbsp nta self another 比較 屬性 add

在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怎麽比較兩個對象的相等?