標準的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時,反向遍歷纔有意義。