zoukankan      html  css  js  c++  java
  • OC中四种遍历方式

    标准的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时,反向遍历才有意义。
  • 相关阅读:
    OpenGL_ES-纹理
    GCD 初步学习
    关于心理的二十五种倾向(查理&#183;芒格)-3
    黑马day18 jquery高级特性&amp;Ajax的load方法
    九度 1138
    FusionCharts简单教程---建立第一个FusionCharts图形
    【转】第二课.配置和初始化
    【转】Git详解之一:Git起步
    【转】1.5 起步
    【转】Cygwin的包管理器:apt-cyg
  • 原文地址:https://www.cnblogs.com/cchHers/p/9072369.html
Copyright © 2011-2022 走看看