美文网首页
for遍历、for in遍历、enumerateObjectsU

for遍历、for in遍历、enumerateObjectsU

作者: 小屋新 | 来源:发表于2017-06-21 17:21 被阅读66次

    废话少说,开门见山!


    遍历常用的基本上有for 、 for in 、enumerateObjectsUsingBlock,先上代码:
    1、先用for循环创建一个数组

    NSMutableArray *muArr = [[NSMutableArray alloc] init];
        for (int i = 0 ; i < 10; i ++) {
            [muArr addObject:[NSString stringWithFormat:@"%d",i]];
        }
    

    用for循环进行遍历(看起来和上面创建数组有点相似,但又不同),我们在循环里加了一个条件,当i==6的时候,在muArr里面加入一个字符串,此时是完全没问题的

    for (int i = 0; i < muArr.count; i ++) {
            NSString *content = [muArr objectAtIndex:i];
            NSLog(@"%@",content);
            
            if (i == 6) {
                [muArr addObject:@"cj"];
            }
        }
    

    现在我们用for in来进行遍历,然后根据条件改变muArr的原有的数据,此时就会出现崩溃

    for (NSString *str in muArr) {
            if ([str isEqualToString:@"6"]) {
                [muArr addObject:@"Annie"];
            }
        }
    

    崩溃内容如下:

     *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x61000004e5e0> was mutated while being enumerated.'
    

    是不是有些纳闷,怎么会崩溃呢,看到错误信息没有,这个数组是个枚举类型的,就是说,for in 遍历是快速枚举,我们不能在这个方法里面对数组进行增、删、改。NSArray的枚举操作中有一条是需要注意:对于可变数组进行枚举操作时,不能通过添加或删除对象等这类操作来改变数组容器,否则就会报错。

    数组还有一个系统自带的方法 enumerateObjectsUsingBlock: 遍历,代码如下,这个方法也是简单的遍历,不能对数组容器进行改变的操作

    [muArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if (idx == 6) {
                *stop = YES;
            }
        }];
    

    顺便赠送一个字典的遍历:

    NSDictionary *dic = @{
                              @"1":@"cj",
                              @"2":@"annie"
                              };
        [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            if ([key isEqualToString:@"1"]) {
                *stop = YES;
            }
        }];
    

    相关文章

      网友评论

          本文标题:for遍历、for in遍历、enumerateObjectsU

          本文链接:https://www.haomeiwen.com/subject/nyxtcxtx.html