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怎么比较两个对象的相等?的主要内容,如果未能解决你的问题,请参考以下文章