47 votes

NSArray + supprimer un élément du tableau

Comment supprimer un élément de NSArray.

127voto

luvieere Points 19689

NSArray n'est pas modifiable, c'est-à-dire que vous ne pouvez pas le modifier. Vous devriez jeter un oeil à NSMutableArray . Consultez la section "Suppression d'objets", vous y trouverez de nombreuses fonctions vous permettant de supprimer des éléments:

 [anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];
 

24voto

ahmet emrah Points 1638
 NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];

[your_array release];

 your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain];
 

C'est à peu près ça

si vous ne possédez pas your_array (c'est-à-dire qu'il est auto-publié), supprimez la publication et conservez les messages

20voto

mxcl Points 5921

Cette catégorie peut être à votre goût. Mais! Soyez économe avec son utilisation; puisque nous convertissons en NSMutableArray et inversement, ce n'est pas du tout efficace.

 @implementation NSArray (mxcl)

- (NSArray *)arrayByRemovingObject:(id)obj
{
    if (!obj) return [self copy]; // copy because all array* methods return new arrays
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self];
    [newArray removeObject:obj];
    return [NSArray arrayWithArray:mutableArray];
}

@end
 

18voto

Rudolf Adamkovic Points 4202

Voici une approche plus fonctionnelle utilisant le codage clé-valeur :

 @implementation NSArray (Additions)

- (instancetype)arrayByRemovingObject:(id)object {
    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]];
}

@end
 

3voto

jmathew Points 435

Fait une catégorie comme mxcl, mais c'est légèrement plus rapide.

Mes tests montrent une amélioration d'environ 15% (je peux me tromper, vous pouvez comparer les deux vous-même).

Fondamentalement, je prends la partie de la matrice qui se trouve devant l'objet et la partie derrière et les combine. Donc exclure l'élément.

 - (NSArray *)prefix_arrayByRemovingObject:(id)object 
{
    if (!object) {
        return self;
    }

    NSUInteger indexOfObject = [self indexOfObject:object];
    NSArray *firstSubArray = [self subarrayWithRange:NSMakeRange(0, indexOfObject)];
    NSArray *secondSubArray = [self subarrayWithRange:NSMakeRange(indexOfObject + 1, self.count - indexOfObject - 1)];
    NSArray *newArray = [firstSubArray arrayByAddingObjectsFromArray:secondSubArray];

    return newArray;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X