标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。
遍历的话,一般是NSArray、NSDictionary、NSSet和自定义的collection。
0、初始化数据
NSArray *array = @[@"ele1", @"ele2", @"ele3", @"ele4"]; NSDictionary *dict = @{@"name" : @"xiaohong", @"age" : @"19", @"gendar" : @"woman"};
1、使用for循环
// 遍历数组 for (int i = 0; i < array.count; i++) { NSString *eleString = [array objectAtIndex:i]; NSLog(@"%@", eleString); } // 遍历字典 for (int i = 0; i < dict.count; i++) { NSString *valueString = [dict.allValues objectAtIndex:i]; NSLog(@"%@", valueString); } // 附加:使用枚举块,forin也能反向遍历 for (NSString *eleString in [array reverseObjectEnumerator]) { NSLog(@"%@", eleString); }
2、使用for-in遍历。特点是简洁、高效。但是注意不要在forin循环体中对元素进行修改
// 遍历数组 for (NSString *eleString in array) { NSLog(@"%@", eleString); } // 遍历字典 for (NSString *valueString in dict.allValues) { NSLog(@"%@", valueString); } // 注意: for (NSString *keyString in dict) { // keyString就是dict中的key值 }
3、使用枚举器遍历
// 遍历数组 // 为这个数组生成一个顺序的枚举器,reverseObjectEnumerator为倒序枚举器 NSEnumerator *arrayEnumerator = [array objectEnumerator]; // 不能使用NSString *string = nil NSString *string = @""; while (string) { string = [arrayEnumerator nextObject]; if (string != nil) { NSLog(@"%@", string); } } // 遍历字典 // 为这个字典生成一个遍历key的枚举器,objectEnumerator为遍历value的枚举器 NSEnumerator *dictKeyEnumerator = [dict keyEnumerator]; // 不能使用NSString *string = nil NSString *keyString = @""; while (keyString) { keyString = [dictKeyEnumerator nextObject]; if (keyString != nil) { NSLog(@"%@", keyString); } } // 附加:使用枚举块,forin也能反向遍历 for (NSString *eleString in [array reverseObjectEnumerator]) { NSLog(@"%@", eleString); }
4、基于块枚举。handler中的参数类型和形参名都是可以进行更改的,这样就省去了手动强制转换代码。
// 枚举数组 [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog(@"%@", obj); if (idx == array.count - 1) { *stop = YES; } }]; // 反向遍历数组 [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog(@"%@", obj); if (idx == array.count - 1) { *stop = YES; } }]; // 枚举字典 [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { NSLog(@"%@", obj); if ([key isEqualToString:@"name"]) { *stop = YES; } }]; // 反向遍历字典 // 需要注意的是:只有在遍历数组或者有序set等有顺序的collection时,反向遍历才有意义。