在for語句中有多種循環變量嗎?這裏會是什麼我談論的假設表示:Obj-C語句中的多個循環變量
for (NSString *foo in bar; NSString *bob in example) {}
如果不是是做到這一點的好辦法?
感謝,
歌林
在for語句中有多種循環變量嗎?這裏會是什麼我談論的假設表示:Obj-C語句中的多個循環變量
for (NSString *foo in bar; NSString *bob in example) {}
如果不是是做到這一點的好辦法?
感謝,
歌林
約書亞是正確的,沒有辦法用快速枚舉語法做到這一點,但有幾種方法(至少)可以實現類似的功能。您更喜歡哪種方法取決於您是否嘗試避免兩次運行循環的開銷,或者您是否嘗試避免代碼中出現兩個單獨循環的視覺混亂。
假設你有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)
就像一個註釋雖然很少,循環有一個對性能產生有意義的影響,所以如果這樣做可以避免兩個循環的運行時間成本,那麼您可能會更好地服務通過其他優化。
謝謝!這工作完美。 – 2010-10-31 17:51:50
不,不使用快速列舉語法呢。
有什麼我可以做的,有可比性的結果嗎? – 2010-10-31 06:05:40
更多關於您正在努力完成的事情 – 2010-10-31 07:30:45
假設塊,一種替代方案:
NSAssert([foo count] == [bar count]);
[foo enumerateUsingBlock: ^(id fooObj, NSUInteger index, BOOL *stopFlag) {
id barObj = [bar objectAtIndex: index];
... do stuff here ...
}];
謝謝..當最低限度的操作系統是iOS4時,請試試這個。 – 2010-10-31 17:52:21
那麼是什麼發生,如果要素的數量是不同的? – tia 2010-10-31 10:59:38
就我而言,它們始終是相同的數字。 – 2010-10-31 21:57:32