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?
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:
.
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;
}
}
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];
}
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). ).
J'utilise ce code pour cela:
for (NSUInteger i = [items count] - 1; ; i--) {
[items removeObjectAtIndex:i];
}