美文网首页
iOS 对象判断相等

iOS 对象判断相等

作者: Rumbles | 来源:发表于2018-09-26 17:04 被阅读28次

==

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

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];
}

参考

相关文章

  • iOS 对象判断相等

    == isEqual 重写isEqual 为什么需要重写对象的hash值 参考

  • iOS 判断对象相等

    1. 思路 当我们想要判断两个对象相等时,我们到底是在比较什么?我觉得可以通过以下三个方面的比较来确定两个对象相等...

  • Swift 对象相等(EqualTo)判断

    Swift 对象相等(EqualTo)判断 @(编程笔记)[iOS开发,Swift] 之前一直知道Swift用的是...

  • js 判断两个对象是否相等

    判断对象相等的步骤:

  • C# 相等比较

    引用相等性 判断两个对象是否引用同一基础对象。使用 ReferenceEquals 方法判断: 值相等性 使用 =...

  • python 高级编程①

    1 ‘==’ 与‘is ’的使用 ① ‘==’判断两个对象内容是否相等 ‘is’判断两个对象的地址是否相等 ②在p...

  • 2019-01-21深入理解js中空对象与空对象不相等的问题

    参考文章 这与之前判断对象是相等一样,因为js相等表示地址相等,不是对象内容相同。 所以我们需要将使用循环判断:判...

  • 关于isEqual

    isEqual,用来判断两个对象是否相等。但是,与“==”判断指针地址是否相等,不同的是,它判断的是对象的内容方...

  • kotlin学习笔记

    $ ?表示对象可能为空 ?: !! ==,=== ==判断值是否相等,===判断值及引用是否完全相等。 ..Kot...

  • iOS判断对象相等 重写isEqual、isEqualToCla

    相等的概念是探究哲学和数学的核心,并且对道德、公正和公共政策的问题有着深远的影响。 从一个经验主义者的角度来看,两...

网友评论

      本文标题:iOS 对象判断相等

      本文链接:https://www.haomeiwen.com/subject/tyadoftx.html