-
遍历数据,最常用的是for循环和快速遍历,也有其他比较陌生的方法,在这里做个记录以备所需。
第一种:常用的for循环,c中也是经常使用
例如:
遍历数组
NSArray *arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
for (int i = 0; i < arr.count; i++) {
NSLog(@"%@", arr[i]);
}遍历字典 NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"}; NSArray *keyArr = [dic allKeys]; for (int i = 0; i < keyArr.count; i++) { //根据键值处理字典中的每一项 NSString *key = keyArr[i]; NSString *value = dic[key]; NSLog(@"%@", value); }
第二种:快速遍历
例如:遍历数组: NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"]; for (NSString *str in arr) { NSLog(@"%@", str); } 遍历字典: NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"}; for (NSString *key in dic) { //处理字典的键值 NSString *value = dic[key]; NSLog(@"%@", value); }
反向遍历:
for (NSString *obj in [arr reverseObjectEnumerator])
第三种:NSEnumerator(枚举查找)
NSEnumerator是一个抽象基类,其中定义了方法:
- (nullable ObjectType)nextObject;
nextObject 是其中最重要的方法,每次调用该方法会返回枚举中的下一个对象,直到返回nil。
例如:
NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
//正向遍历
NSEnumerator *enumerator = [arr objectEnumerator];
//反向遍历
NSEnumerator *enumerator = [arr reverseObjectEnumerator];
id object;
while ((object = [enumerator nextObject]) != nil) {
//处理枚举器中的数据
NSLog(@"%@", object);
}
第四种:基于block的遍历
遍历数组:
NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"E"]) {
*stop = YES;
}
}];
参数说明:obj表示数组中的元素,idx表示元素的下标,stop可以控制遍历何时停止,在需要停止时将stop = YES(注意前面的*不能忘)。
反向遍历:
NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
[arr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"E"]) {
*stop = YES;
}
}];
遍历字典:
NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"22"]) {
*stop = YES;
}
}];
如果知道对象的数据类型,就可以检测是否调用了该对象不具有的方法。如:
NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
[dic enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"22"]) {
*stop = YES;
}
}];
并发遍历:
NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
NSMutableArray *mutArr = [NSMutableArray arrayWithArray: arr];
[mutArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj = [NSString stringWithFormat:@"_%@", obj];
[mutArr replaceObjectAtIndex:idx withObject:obj];
NSLog(@"%@", obj);
if ([obj isEqualToString:@"_I"]) {
*stop = YES;
}
}];