一,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"]