2010-10-31 26 views
1

在for語句中有多種循環變量嗎?這裏會是什麼我談論的假設表示:Obj-C語句中的多個循環變量

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

如果不是做到這一點的好辦法?

感謝,

歌林

+2

那麼是什麼發生,如果要素的數量是不同的? – tia 2010-10-31 10:59:38

+0

就我而言,它們始終是相同的數字。 – 2010-10-31 21:57:32

回答

4

約書亞是正確的,沒有辦法用快速枚舉語法做到這一點,但有幾種方法(至少)可以實現類似的功能。您更喜歡哪種方法取決於您是否嘗試避免兩次運行循環的開銷,或者您是否嘗試避免代碼中出現兩個單獨循環的視覺混亂。

假設你有NSString的兩個集合如果你正在尋找遍歷兩個集合,你可以做以下的所有元素(他們並不需要是NSArrays BTW)

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)

就像一個註釋雖然很少,循環有一個對性能產生有意義的影響,所以如果這樣做可以避免兩個循環的運行時間成本,那麼您可能會更好地服務通過其他優化。

+0

謝謝!這工作完美。 – 2010-10-31 17:51:50

1

不,不使用快速列舉語法呢。

+0

有什麼我可以做的,有可比性的結果嗎? – 2010-10-31 06:05:40

+0

更多關於您正在努力完成的事情 – 2010-10-31 07:30:45

1

假設塊,一種替代方案:

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

謝謝..當最低限度的操作系統是iOS4時,請試試這個。 – 2010-10-31 17:52:21