标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。数组
遍历的话,通常是NSArray、NSDictionary、NSSet和自定义的collection。spa
0、初始化数据code
NSArray *array = @[@"ele1", @"ele2", @"ele3", @"ele4"]; NSDictionary *dict = @{@"name" : @"xiaohong", @"age" : @"19", @"gendar" : @"woman"};
一、使用for循环blog
// 遍历数组 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); }
二、使用for-in遍历。特色是简洁、高效。可是注意不要在forin循环体中对元素进行修改string
// 遍历数组 for (NSString *eleString in array) { NSLog(@"%@", eleString); } // 遍历字典 for (NSString *valueString in dict.allValues) { NSLog(@"%@", valueString); } // 注意: for (NSString *keyString in dict) { // keyString就是dict中的key值 }
三、使用枚举器遍历it
// 遍历数组 // 为这个数组生成一个顺序的枚举器,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); }
四、基于块枚举。handler中的参数类型和形参名都是能够进行更改的,这样就省去了手动强制转换代码。io
// 枚举数组 [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时,反向遍历才有意义。