iOS 对象判断相等

2018-09-26  本文已影响28人  Rumbles

==

对于基本类型, ==运算符比较的是值; 
对于对象类型, ==运算符比较的是对象的地址(即是否为同一对象)

isEqual

UIColor *color1 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
UIColor *color2 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
NSLog(@"color1 == color2 = %@", color1 == color2 ? @"YES" : @"NO");
NSLog(@"[color1 isEqual:color2] = %@", [color1 isEqual:color2] ? @"YES" : @"NO");

color1 == color2 = NO
[color1 isEqual:color2] = YES

对于OC系统对象 内部已经做了处理 会判断他们相等
但是 我们的自定义对象如果不重写 isEqual 返回的是NO 所以如果要判断 我们自己的对象是否相等 就需要我们自己 来重写isEqual方法

重写isEqual

@interface Person : NSObject<NSCopying>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *age;
@property (nonatomic, strong) NSDate *date;
@end

- (BOOL)isEqual:(id)object {
    if (self == object) {
        return YES;
    }
    
    if (![object isKindOfClass:[Person class]]) {
        return NO;
    }
    
    return [self isEqualToPerson:(Person *)object];
}

- (BOOL)isEqualToPerson:(Person *)person {
    if (!person) {
        return NO;
    }
    
    BOOL haveEqualNames = (!self.name && !person.name) || [self.name isEqualToString:person.name];
    BOOL haveEqualBirthdays = (!self.age && !person.age) || [self.age isEqualToString:person.age];
    
    return haveEqualNames && haveEqualBirthdays;
}

为什么需要重写对象的hash值

hash方法只在对象被添加至NSSet和设置为NSDictionary的key时会调用
也就是当我们的对象作为key的时候我们就需要重写hash值了

    Person *person1 = [Person personWithName:@"Joe" age:@"32"];
    Person *  = [Person personWithName:@"Joe" age:@"32"];
    Person *person3 = [Person personWithName:@"Joe" age:@"33"];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:@"1" forKey:person1];
    [dict setObject:@"2" forKey:person2];
    [dict setObject:@"3" forKey:person3];
    NSLog(@"person1----%@", [dict objectForKey:person1]);
    NSLog(@"person2----%@", [dict objectForKey:person2]);
    NSLog(@"person3----%@", [dict objectForKey:person3]);
    NSLog(@"dict count: %ld", dict.count);
这时候输出的是 3。但是我们重写了isEqual方法  person1 person2 是同一个对象 应该输出的是2。 所以我们需要重写 hash 方法 
- (NSUInteger)hash {
    return [self.name hash] ^ [self.birthday hash];
}

参考

上一篇 下一篇

猜你喜欢

热点阅读