2012-09-03 34 views
0

allItemsNSMutableArray,當用戶單擊加號按鈕時,方法createItem被調用。我想只添加對象爲每個偶數指數(類BNRItem的),所以我試圖把的NSNull實例爲奇數指標:NSNull in NSMutableArray

-(BNRItem *)createItem { 
    BNRItem *p = [[BNRItem alloc] init]; 
    if ([allItems count] == 0) 
     [allItems addObject: p]; 
    else { 
     [allItems addObject: [NSNull null]]; 
     [allItems addObject: p]; 
    } 
    return p; 
} 

和輸出後,我點擊加號按鈕3次是這樣的:

2012-09-03 13:20:13.876 Homepwner[718:f803] Index: 0 item: Laptop (123): Worth $60, recorded on (September) 
2012-09-03 13:20:13.876 Homepwner[718:f803] Index: 1 item: <null> 
2012-09-03 13:20:13.877 Homepwner[718:f803] Index: 2 item: Brush (234): Worth $14, recorded on (September) 
2012-09-03 13:20:13.882 Homepwner[718:f803] Index: 1 item: <null> 
2012-09-03 13:20:13.882 Homepwner[718:f803] Index: 4 item: Calculator (345): Worth $19, recorded on (September) 

如果我繼續點擊加號按鈕,<null>對象始終保持在指數1,而不是遞增至3,5,等等。我想知道爲什麼它是這樣的以及我如何修復它。

+1

顯示打印該代碼的代碼。 – Dani

+1

我不知道你在做什麼錯你的日誌記錄,但項目進入陣列正確 - 只是記錄allItems,這是正確的。 – rdelmar

回答

4

你不顯示您的日誌記錄代碼,但是,成果的基礎上,我會說,你正在做的事情,如:

for(id obj in arr){ 
    NSLog(@"Index: %lu item: %@", [arr indexOfObject:obj], obj); 
} 

indexOfObject:方法找到其中obj是最低指數等於數組中的一個項目。由於[NSNull null]總是給你相同的對象(這是一個單),當obj在循環是NSNullindexOfObject:將始終停留在1

for搜索 - in循環將總是通過爲了您的數組,所以你可以只保留一個計數器來顯示當前的指數:

NSUInteger idx = 0; 
for(id obj in arr){ 
    NSLog(@"Index: %lu item: %@", idx++, obj); 
} 

或使用 「常規」 for循環:

NSUInteger count = [arr count]; 
for(NSUInteger i = 0; i < count; i++){ 
    NSLog(@"Index: %lu item: %@", i, [arr objectAtIndex:i]); 
} 

最後,如果您只記錄它,則該陣列將自行打印並將description發送到每個包含的項目:NSLog(@"%@", arr);。這將是有序的,所以除非你真的需要附上索引,否則我會建議。

1

Josh Caswell的回答是對的,但另一種方法可能是使用block-based enumeration,因爲您將獲得當前索引和對象。

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSLog(@"Index: %lu item:%@", idx, obj); 
}]; 

此代碼

NSMutableArray *mArray = [NSMutableArray array]; 

[mArray addObject:@(1)]; 
[mArray addObject:@(5)]; 
[mArray addObject:@(7)]; 
[mArray addObject:@(1)]; 
[mArray addObject:[NSNull null]]; 
[mArray addObject:@(10)]; 
[mArray addObject:[NSNull null]]; 

[mArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSLog(@"%lu %@", idx, obj); 
}]; 

將導致:

Index: 0 item:1 
Index: 1 item:5 
Index: 2 item:7 
Index: 3 item:1 
Index: 4 item:<null> 
Index: 5 item:10 
Index: 6 item:<null> 

這種方式的好處是,你有突變阻止安全,快速枚舉,而你也沒有其他(可能有錯誤)查找索引。

docs

對於的NSArray枚舉,索引參數是用於併發枚舉有用。如果沒有此參數,訪問索引的唯一方法是使用indexOfObject:

+1

我的天啊,現在我明白了,你應該如何翻譯'for i,o in enumerate(l):'from Python。好想法! –