代码之家  ›  专栏  ›  技术社区  ›  Kolin Krewinkel

Obj-C中For语句中的多个循环变量

  •  1
  • Kolin Krewinkel  · 技术社区  · 14 年前

    在for语句中有多个循环变量吗?下面是我所说的假设:

    for (NSString *foo in bar; NSString *bob in example) {}

    如果不是什么 一个很好的方法来完成这个任务?

    谢谢,

    3 回复  |  直到 14 年前
        1
  •  4
  •   Mattia    14 年前

    Joshua是对的,没有办法用快速枚举语法来实现它,但是有两种方法(至少)可以实现类似的功能。您喜欢哪种方法取决于您是在尝试避免运行两次循环的开销,还是在尝试避免代码中有两个独立循环的视觉混乱。

    假设您有两个nsstring集合(顺便说一句,它们不需要是nsarray)

        NSArray* foo = [NSArray arrayWithObjects:@"bar1", @"bar2", @"bar3", @"bar4", @"bar5", nil];
    NSArray* example = [NSArray arrayWithObjects:@"example1", @"example2", nil];
    

        NSEnumerator* fooEnumerator = [foo objectEnumerator];
    NSEnumerator* exampleEnumerator = [example objectEnumerator];
    
    NSString *bar, *bob;
    
    while ((bar = [fooEnumerator nextObject]) || (bob = [exampleEnumerator nextObject])) {
        if (bar) {
            NSLog(@"%@", bar);
        }
        if (bob) {
            NSLog(@"%@", bob);
        }
    }
    

    这将首先遍历所有bar元素,然后遍历所有example元素(即,它将输出:bar1、bar2、bar3、bar4、bar5、example1、example2)。

    如果要最小化循环的迭代次数,并且不必运行两个集合的所有元素,则可以尝试将上面的while循环替换为:

    while ((bar = [fooEnumerator nextObject]) && (bob = [exampleEnumerator nextObject])) {
        NSLog(@"%@", bar);
        NSLog(@"%@", bob);
    }
    

    这将同时循环遍历两个集合,但一旦其中一个集合用完元素(即,它将输出:bar1、example1、bar2、example2)就会停止

    不过,值得注意的是,很少有循环对性能产生有意义的影响,因此如果这一切都是为了避免两个循环的运行时开销,那么其他优化可能会更好地为您服务。

        2
  •  1
  •   Joshua Weinberg    14 年前

    不,反正不使用快速枚举语法。

        3
  •  1
  •   bbum    14 年前

    假设是块,另一种选择是:

    NSAssert([foo count] == [bar count]);
    [foo enumerateUsingBlock: ^(id fooObj, NSUInteger index, BOOL *stopFlag) {
        id barObj = [bar objectAtIndex: index];
        ... do stuff here ...
    }];