Edit: Wie @trojanfoe hingewiesen heraus, es ist schön hinzuzufügen, dass Sie niemals ein Array bearbeiten sollten, während Sie es iterieren. Dies gilt für viele Auflistungsklassen in vielen verschiedenen Sprachen. nicht nur NSMutableArray
& Objective-C. Dies kann leicht zu einem Out-of-Bound-Index führen.
Für Ihre Frage, machen wir es in zwei Iterationen. Zuerst möchten wir die Indizes, die wir löschen möchten, speichern, so dass wir auf dem sourceArray iterieren werden.
NSMutableArray * indexesToRemove = [NSMutableArray array];
[sourceArray enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.integerValue%2 == 1) {
// Insert at first position
[indexesToRemove insertObject:@(idx) atIndex:0];
}
}];
Es ist wichtig, den Index in einem Array und nicht in einem Satz zu speichern, da Sie Objekte später einfügen möchten. Außerdem ist es wichtig, die neuen Elemente am Anfang des Arrays hinzuzufügen, damit Sie vom größten Index zum kleinsten iterieren und die Indizes nicht entsprechend den zuvor hinzugefügten Elementen verschieben müssen.
Jetzt können Sie in einer neuen Iteration (diesmal auf dem Index-Array), die Elemente löschen und die neue hinzufügen die Indizes entsprechend Ihnen gespeichert:
[indexesToRemove enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSUInteger indexToRemove = obj.unsignedIntegerValue;
// Delete the item from the source array
[sourceArray removeObjectAtIndex:indexToRemove];
// Create the items you want to insert, do whatever you want in this method :]
NSArray * itemsToAdd = [self generateElementsToAddAtIndex:indexToRemove];
// Create the indexSet according to the start index and the number of objects you want to insert
NSIndexSet * indexSet = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(indexToRemove, itemsToAdd.count)];
// Insert the objects
[sourceArray insertObjects:itemsToAdd atIndexes:indexSet];
}];
Verwenden Sie Swift oder Objective-C? Nur um zu wissen, wie man antwortet;) –
Ich benutze objc, danke – longbow
Ok, also ich in diesem Fall sollten Sie sich http://StackOverflow.com/Questions/25238436/ISit-Possible-To-Delete-Dictionary -from-mutablearray-while-iterating/25238661 # 25238661, das ist fast alles, was Sie brauchen :) –