Переменные с несколькими циклами в выражении For в Obj-C - PullRequest
1 голос
/ 31 октября 2010

Есть ли способ иметь несколько переменных цикла в операторе for? Вот гипотетическое представление того, о чем я говорю:

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

Если не то, что является хорошим способом сделать это?

Спасибо

Kolin

Ответы [ 3 ]

4 голосов
/ 31 октября 2010

Джошуа прав, что нет способа сделать это с быстрым синтаксисом перечисления, но есть пара способов (по крайней мере), вы можете достичь чего-то подобного.Какой подход вы предпочитаете, зависит от того, пытаетесь ли вы избежать накладных расходов на выполнение цикла дважды или же вы пытаетесь избежать визуального беспорядка наличия двух отдельных циклов в вашем коде.

Предполагается, что у вас есть две коллекцииNSStrings (они не обязательно должны быть NSArrays)

    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);
    }
}

это будет перебирать сначала все элементы бара, а затем все элементы примера (т. е. выводить: bar1, bar2, bar3, bar4, bar5, example1, example2).

, если вы хотите минимизироватьколичество итераций цикла и не обязательно выполнять все элементы обеих коллекций, вы можете попытаться заменить вышеприведенный цикл while следующим образом:

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

Это будет проходить через обе коллекции одновременно, но остановиткак только в одной из коллекций закончатся элементы (то есть будет выведено: bar1, example1, bar2, example2)

Как примечание, довольно редко, когда циклы оказывают существенное влияние на производительность, поэтому, если это все, чтобы избежать затрат времени выполнения двух циклов, вы, вероятно, лучше обслуживаете другие оптимизации.

1 голос
/ 31 октября 2010

Предполагая блоки, альтернатива:

NSAssert([foo count] == [bar count]);
[foo enumerateUsingBlock: ^(id fooObj, NSUInteger index, BOOL *stopFlag) {
    id barObj = [bar objectAtIndex: index];
    ... do stuff here ...
}];
1 голос
/ 31 октября 2010

Нет, в любом случае не используется быстрый синтаксис перечисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...