ios中判断是否相等

500 阅读3分钟

字符串相等

- (void)testStringEqual {

    NSString *stringA = @"stringA";

    NSString *stringB = [NSString stringWithFormat:@"stringA"];

    //字符串不可以直接使用 ==  来判断

    if (stringA == stringB) {

        NSLog(@"字符串stringA == 字符串stringB");

    }

    //isEqual string 本身就是对象类型,可以使用NSObjct的方法

    BOOL equal1 = [stringA isEqual:stringB];

    NSLog(@"stringA 和stringB 相等:%d",equal1);

    

    // isEqualToString 对于string类型来说使用 isEqualToString 比 isEqual 更高效

    BOOL equal2 = [stringA isEqualToString:stringB];

    NSLog(@"stringA 和stringB 相等:%d",equal2);

}

IndexPath相等

/*

 2022-10-18 13:54:49.120806+0800 compareObject[76481:10481317] 1indexPath1 == indexPath2

 2022-10-18 13:54:49.120869+0800 compareObject[76481:10481317] 2indexPath1 == indexPath2

 2022-10-18 13:54:49.120911+0800 compareObject[76481:10481317] indexPath1 和 indexPath2 是相等的

 */

//对于indexPath 来说,相同的row 和 inSection 生成的indexPath 对象地址是一样的,

//因此对于indexPath 来说可以有三种判断相等的方法, 1. == (因为地址一样,就是同一个对象)  2.isEqual: 主要是判断的是对象的hash值 3. compare 这个是 indexPath特有的,返回的结果是NSComparisonResult 对象.

- (void)testIndexPath {
    NSIndexPath *indexPath1 = [NSIndexPath indexPathForRow:1 inSection:2];

    NSIndexPath *indexPath2 = [NSIndexPath indexPathForItem:1 inSection:2];

    if(indexPath1 == indexPath2) {

        NSLog(@"1indexPath1 == indexPath2");

    }

    if ([indexPath1 isEqual:indexPath2]) {

        NSLog(@"2indexPath1 == indexPath2");

    }
    
    NSComparisonResult result = [indexPath1 compare:indexPath2];

    if (result == NSOrderedSame) {

        NSLog(@"indexPath1 和 indexPath2 是相等的");

    }

}

Array 比较是否相等

//输出 数组用isEqualToArray判断是相同的, 因为数组中的字符串是相等的.

- (void)testArray {

    NSString *stringA = @"stringA";

    NSString *stringB = [NSString stringWithFormat:@"stringA"];

    NSArray *arrayA = @[stringA, @"2",@"3"];

    NSMutableArray *tempArray = [NSMutableArray array];

    [tempArray addObject:stringB];

    [tempArray addObject:@"2"];

    [tempArray addObject:@"3"];

    NSArray *arrayB = [tempArray copy];

    BOOL equalArray = [arrayA isEqualToArray:arrayB];

    if (equalArray) {

        NSLog(@"数组用isEqualToArray判断是相同的");

    }

}

//输出结果是不相等的,因为数组还是逐个比较对象里面的hash值,hash值就是对象是同一个.

- (void)testArray2 {

    Person *person1 = [Person new];

    person1.name = @"name";

    person1.age = 24;

    

    Person *person2 = [Person new];

    person2.name = @"name";

    person2.age = 24;

    

    NSArray *array1 = @[person1];

    NSArray *array2 = @[person2];

    

    BOOL equalArray = [array1 isEqualToArray:array2];

    if (equalArray) {

        NSLog(@"数组用isEqualToArray判断是相同的");

    }else {

        NSLog(@"数组用isEqualToArray判断是不相等的");

    }

}

对象是否相等

//对于对象类型来说,NSObject 主要是针对地址来说,即便是你创建一个 Person 对象,Person的属性完全相同,这时用isEqual 也是不相等的.

- (void)testObject {

    NSObject *objet1 = [NSObject new];

    NSObject *object2 = [NSObject new];

    //不会打印输出的

    if ([objet1 isEqual:object2]) {

        NSLog(@"objet1 和 object2  两个对象相等");

    }

}

总结

isEqual 本质是比较指针是否相等,方式是使用hash值进行判断.和 == 没差别,不过 == 还可以用于数值的判断.

  • string 使用isEqualToString和isEqual均可以,isEqualToString 对于string类型来说使用 isEqualToString 比 isEqual 更高效,优先采用 isEqualToString。

  • 对于Array isEqualToArray 主要是对数组的元素进行 isEqual 进行判断,不判断数组本身的地址是否一致。

  • 于NSIndexPath 来说可以有三种判断相等的方法. 1. == (因为地址一样,就是同一个对象)  2.isEqual: 主要是判断的是对象的hash值 3. compare 这个是 indexPath特有的,返回的结果是NSComparisonResult 对象. 还有一些子类重写了isEqual 的方法。

     NSAttributedString -isEqualToAttributedString:

     NSData -isEqualToData:

     NSDate -isEqualToDate:

     NSDictionary -isEqualToDictionary:

     NSHashTable -isEqualToHashTable:

     NSIndexSet -isEqualToIndexSet:

     NSNumber -isEqualToNumber:

     NSOrderedSet -isEqualToOrderedSet:

     NSSet -isEqualToSet:

     NSString -isEqualToString:

     NSTimeZone -isEqualToTimeZone:

     NSValue -isEqualToValue: