Джошуа прав, что нет способа сделать это с быстрым синтаксисом перечисления, но есть пара способов (по крайней мере), вы можете достичь чего-то подобного.Какой подход вы предпочитаете, зависит от того, пытаетесь ли вы избежать накладных расходов на выполнение цикла дважды или же вы пытаетесь избежать визуального беспорядка наличия двух отдельных циклов в вашем коде.
Предполагается, что у вас есть две коллекции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)
Как примечание, довольно редко, когда циклы оказывают существенное влияние на производительность, поэтому, если это все, чтобы избежать затрат времени выполнения двух циклов, вы, вероятно, лучше обслуживаете другие оптимизации.