web-dev-qa-db-fra.com

Supprimer un objet de NSMutableArray

Je suis tombé sur le raccourci suivant lors de la configuration d’une boucle for (raccourci comparé aux exemples de manuels que j’ai utilisés):

for (Item *i in items){ ... }

Par opposition au format plus long:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right

Si j'utilise la version abrégée, y a-t-il un moyen de supprimer l'élément en cours de réitération (c'est-à-dire «i»)? Ou dois-je utiliser le format plus long?

15
Ben Packard

Vous ne pouvez pas supprimer des objets d'un tableau pendant que énumération rapide it:

la numérotation est «sûre» - l'énumérateur dispose d'un garde des mutations. Ainsi, si vous tentez de modifier la collection pendant l'énumération, une exception est déclenchée.

Quoi qu'il en soit, pourquoi avez-vous besoin de changer de conteneur tout en l'énumérant? Pensez à stocker les éléments à supprimer et supprimez-les de votre conteneur à l'aide de la méthode removeObjectsInArray: ou removeObjectsAtIndexes:.

31
Vladimir

Il suffit d'ajouter le mot clé break; après avoir supprimé l'élément ...

for(id item in items) {
    if([item isEqual:itemToDelete]) {
        [items removeObject:item];
        break;
    }
}
9
RaiderF

Une collection Objective-C ne doit pas être modifiée lors de l'énumération.

Vous pouvez utiliser cette variante pour supprimer des objets de la collection:

for (NSInteger i = items.count - 1; i >= 0 ; i--) {
   [items removeObjectAtIndex:i];
}
3
sergii

La première boucle est une boucle "pour chaque" dans Objective C.

* i est un pointeur sur l'élément direct dans items-Array (la plupart du temps, ce sera NSMutableArray).

De cette façon, vous pouvez agir directement sur l'article:

[items removeObject: i];

Cela (devrait) fonctionner - je ne travaille pas actuellement sur mon Mac et je ne peux pas le vérifier. Cependant, Objective-C empêche peut-être de supprimer des objets tout en parcourant la collection (ce qui est assez courant dans la plupart des langues). ).

1
BergmannF

J'utilise ce code pour cela:

for (NSUInteger i = [items count] - 1; ; i--) {
     [items removeObjectAtIndex:i];
}
0
slava