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