Какой самый простой способ удалить пустые NSStrings из NSArray?

В PHP это одна строка кода:

$array_without_empty_strs = array_filter($array_with_empty_strs);

Каков объективный C-эквивалент?

UPDATE - добавлен следующий тестовый код, чтобы проиллюстрировать использование решения Nikolai Ruhe:

// SOLUTION Test Code
NSMutableArray *myArray = [[NSMutableArray alloc] init ];
[myArray addObject:[NSNumber numberWithInt:5]];
[myArray addObject:@""];
[myArray addObject:@"test"];
NSLog(@"%@", myArray);
[myArray removeObject:@""];
NSLog(@"%@", myArray);

// SOLUTION Test Code Output
2012-07-12 08:18:16.271 Calculator[1527:f803] (
    5,
    "",
    test
)
2012-07-12 08:18:16.273 Calculator[1527:f803] (
    5,
    test
)

Ответы

Ответ 1

Это еще проще:

[mutableArrayOfStrings removeObject:@""];

Если ваш массив не изменен, вам нужно создать mutableCopy раньше.

removeObject: удаляет все объекты из массива, которые возвращают YES из isEqual:.

Ответ 2

NSArray *noEmptyStrings = [maybeEmptyStrings filteredArrayUsingPredicate:
    [NSPredicate predicateWithFormat:@"length > 0"]];

Ответ 3

мы можем использовать NSPredicate  здесь мой код

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id str, NSDictionary *unused) {
            return ![str isEqualToString:@""];
        }];

        NSArray *filtered = [yourArray filteredArrayUsingPredicate:pred];

Ответ 4

Посмотрите этот вопрос, который почти точно совпадает с вашим.

Я использую этот метод для нестроковых (объектных) случаев, которые не работают с NSPredicate

Где массив NSMutableArray

- (void) clearArrayOut
{

    for (int j=[array count]-1; j>=0; j--)
        if ([[array objectAtIndex:j] length] == 0)
            [array removeObjectAtIndex:j];
}

И я полностью просто украл это из rob mayoff красивый ответ на мой вопрос NSPredicate вместо цикла для фильтрации массива объектов

Ответ 5

Здесь альтернативный метод, который более гибкий, чем использование предиката.

NSArray* filteredArray = [arrayToFilter objectsWithIndexes: 
                              [arrayToFilter indexesOfObjectsPassingTest: 
                                 ^((id obj, NSUInteger idx, BOOL *stop)
                                 {
                                     return [obj length] > 0;
                                 }]];