• 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时,反向遍历才有意义。
  • 相关阅读:
    黄聪:VS中 "Duplicate items are not supported by the "Resources" parameter" 解决方法
    黄聪:新浪编辑器 SinaEditor
    黄聪:Delphi实现软件中登录用户的操作权限
    黄聪:Asp.Net性能优化
    黄聪:SQL Server 2005开窗函数的使用
    黄聪:Delphi 连接DBF数据
    黄聪:OpenGl 初级入门学习视频教程, 绘制一个立方体
    黄聪:再议.Net中null的使用规范
    黄聪:.NET开发中的Exception处理三定律[转]
    黄聪:SQL Server 开发之 复制表数据的SQL脚本生成器
  • 原文地址:https://www.cnblogs.com/cchHers/p/9072369.html
Copyright © 2020-2023  润新知