OC中四種遍歷方式

標準的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時,反向遍歷纔有意義。
相關文章
相關標籤/搜索