iOS開發中Block實現數組遍歷和排序的總結

一,enumerateObjectsUsingBlock 實現數組遍歷
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
[arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"Before ------- %ld", idx);
        if (idx == 1) {

           *stop = YES;

            return;
        }
        NSLog(@"After ------- %ld", idx);
    }];

1.只用 *stop = YES; 本次循環執行完成,結束數組的循環,不再進行下一個idx的遍歷

2.只用 return; 本次循環到此中斷(不執行本次循環剩餘的代碼),繼續進行下一個idx的遍歷,相當於for循環中continue的用法

3.*stop = YES; 和 return; 連用,不執行本次循環剩餘的代碼,而且到此idx爲止,結束數組的循環Block,相當於for循環中break的用法

二,sortedArrayUsingComparator 實現數組排序

    NSArray *list = [NSArray arrayWithObjects:@"2",@"1",@"5",@"4", nil];

    NSArray *tArray = [list sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        if ([obj1 integerValue] > [obj2 integerValue]) {

            return NSOrderedDescending;

        }

        return NSOrderedAscending;

    }];

註釋:對於生序/降序容易混淆的同學,可以這樣理解:無論比較符號是大於還是小於,只看return的值是NSOrderedDescending還是NSOrderedAscending,

如果obj1>obj2, 返回Descending,意爲倒過來排序,也就是說obj2要放在前面,小的在前,所以是升序;

如果obj1>obj2, 返回Ascending,意爲正序排列,也就是說obj1放在前面,大的在前,所以是降序;

更簡明的總結爲一句話:兩個值做比較,根據return的是正序還是倒序,判斷是大的在前還是小的在前,由此確定是降序還是生序

三,實現數組倒置

    NSArray *list = [NSArray arrayWithObjects:@"2",@"1",@"5",@"4", nil];

    NSArray *tArray = [list sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

            return NSOrderedDescending;

           // return NSOrderedAscending;

    }];

註釋:如果不做元素的比較,而直接返回NSOrderedDescending / NSOrderedAscending,也就意味着執行倒序 / 正序(正序就是保持現在的排序不變)

以此數組爲例,執行NSOrderedDescending,tArray內元素的順序會整個倒置,成爲[@"4",@"5",@"1",@"2"]

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章