фильтрация NSArray в новый NSArray в Objective C

Я имею NSArray и я хотел бы создать новое NSArray с объектами от исходного массива, которые соответствуют определенным критериям. Критерии решены функцией, которая возвращает a BOOL.

Я могу создать NSMutableArray, выполните итерации через исходный массив и копию по объектам, которые принимает функция фильтра, и затем создайте неизменную версию его.

Существует ли лучший путь?

117
задан Cœur 9 August 2019 в 03:37
поделиться

2 ответа

NSArray и NSMutableArray предоставляют методы для фильтрации содержания массива. NSArray обеспечивает filteredArrayUsingPredicate: , который возвращает новый массив, содержащий объекты в получателе, которые соответствуют указанному предикату. NSMutableArray добавляет filterUsingPredicate: , который оценивает receiver’s содержание против указанного предиката и оставляет только объекты тем соответствием. Эти методы проиллюстрированы в следующем примере.

NSMutableArray *array =
    [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];

NSPredicate *bPredicate =
    [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
    [array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.

NSPredicate *sPredicate =
    [NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
137
ответ дан Niall Kiddle 24 November 2019 в 02:04
поделиться

Предположение, что Ваши объекты все имеют подобный тип, Вы могли добавить метод как категорию их базового класса, который вызывает функцию, которую Вы используете для своих критериев. Тогда создайте объект NSPredicate, который обращается к тому методу.

В некоторой категории определяют Ваш метод, который использует Вашу функцию

@implementation BaseClass (SomeCategory)
- (BOOL)myMethod {
    return someComparisonFunction(self, whatever);
}
@end

Тогда везде, где Вы будете фильтровать:

- (NSArray *)myFilteredObjects {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMethod = TRUE"];
    return [myArray filteredArrayUsingPredicate:pred];
}

, Конечно, если Ваша функция только выдерживает сравнение со свойствами, достижимыми из Вашего класса, может просто быть легче преобразовать условия функции в строку предиката.

16
ответ дан Ashley Clark 24 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: