NSArray + удалить элемент из массива - PullRequest
43 голосов
/ 13 ноября 2009

Как удалить элемент из NSArray.

Ответы [ 7 ]

122 голосов
/ 13 ноября 2009

NSArray не является изменяемым, то есть вы не можете его изменить. Вы должны взглянуть на NSMutableArray . В разделе «Удаление объектов» вы найдете множество функций, которые позволяют удалять элементы:

[anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];
24 голосов
/ 13 ноября 2009
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];

[your_array release];

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

вот и все

если вы не являетесь владельцем your_array (т.е. он автоматически выпущен), удалите выпуск и сохраните сообщения

20 голосов
/ 26 ноября 2010

Эта категория может быть на ваш вкус. Но! Быть бережливым с его использованием; так как мы конвертируем в NSMutableArray и обратно, это совсем не эффективно.

@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];
    [mutableArray removeObject:obj];
    return [NSArray arrayWithArray:mutableArray];
}

@end
18 голосов
/ 06 мая 2014

Вот более функциональный подход с использованием Кодирование значения ключа :

@implementation NSArray (Additions)

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

@end
3 голосов
/ 22 октября 2014

Удалить Object из NSArray с помощью этого метода:

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
    [modifyableArray removeObjectAtIndex:index];
    return [[NSArray alloc] initWithArray:modifyableArray];
}
3 голосов
/ 12 декабря 2013

Сделал категорию вроде mxcl, но это немного быстрее.

Мое тестирование показало улучшение ~ 15% (могу ошибаться, не стесняйтесь сравнивать эти два самостоятельно)

В основном я беру часть массива, которая находится перед объектом, и часть позади, и объединяю их.Таким образом исключая элемент.

- (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;
}
0 голосов
/ 19 апреля 2019

Как предлагали другие, NSMutableArray имеет методы для этого, но иногда вы вынуждены использовать NSArray, я бы использовал:

NSArray* newArray = [oldArray subarrayWithRange:NSMakeRange(1, [oldArray count] - 1)];

Таким образом, oldArray остается прежним, но новый Array будет создан с первым удаленным элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...