2013-02-18 70 views
1

我正在寫一個for in循環從一個NSArray讀取名稱的列表,這裏是我的代碼。在循環中獲取當前循環編號的更簡單方法?

NSArray *names = [NSArray arrayWithObjects:@"Luke",@"James",@"Fred",@"Harry", nil]; 

for (NSString *name in names) { 

    NSLog(@"%@",name); 

} 

我試圖確定的是羯羊還有一個更簡單的方式來獲得電流回路數量不增加的變量,像這樣的循環外..

int number = 0; 

for (NSString *name in names) { 

    number++; 
    NSLog(@"%i - %@",number,name); 

} 

有一個內置的「循環編號'屬性,可以在for循環中訪問? - 我吠叫了錯誤的樹嗎?我應該只使用這個變量來克服它嗎?

回答

1

你做了什麼是合理的(雖然我把number++在循環的末尾)。通常,當我需要一個循環指數,我躲得快枚舉和使用更傳統的for循環:

for (NSUInteger i=0; i<[names count]; i++) { 
    NSString *name = names[i]; 
    NSLog(@"%i - %@", i, name); 
} 
+0

歡呼所示,將中真正的好tho ..恥辱它不是像魔術@託姆 – Wez 2013-02-18 19:34:51

+0

@Wezly其實,湯姆是不正確的。你可以得到一個對象的索引。看到我的答案。 – 2013-02-18 19:35:26

+0

@ H2CO3,我看到你來自哪裏,雖然我有點希望從for循環獲取索引或循環數,而不是再次檢查數組。 – Wez 2013-02-18 19:37:30

1

如果您需要的指數,使用循環標準的3部分,或用while循環number計數器。沒辦法神奇地得到for...in樣式循環中的索引。

1

這似乎頗有黑客攻擊的一位。你既可以使用一個正常的循環,而不是快速列舉,或使用塊列舉的​​對象,或者您也可以使用indexOfObject:方法中的for循環(但這是真的氣餒,因爲它只能如果你只有唯一的數組中的對象,反正反覆查找會讓它變慢)。總之,試試這個:

int i; 
for (i = 0; i < names.count; i++) { 
    NSString *name = [names objectAtIndex:i]; 
    // and "i" already stores the index 
} 

或本:

[names enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    // use obj and idx 
}]; 

,這也是可能的,但不這樣做:

for (NSString *name in names) { 
    int idx = [names indexOfObject:name]; 
    // etc. 
} 
+0

但不這樣做,因爲它比簡單的'int ++;'慢? – Wez 2013-02-18 19:36:06

+2

@Wezly好看多了,是的,但主要是因爲它是,如果你在陣列中具有相同的對象兩次:) – 2013-02-18 19:36:45

+2

@ H2CO3,是啊,這(通常)工作,但它是一個非常蹩腳的解決方案打破,因爲你最終在每次通過循環時搜索數組中的當前元素。這可能會導致大數組變得非常慢。 – 2013-02-18 19:37:19