NSMutableArray и NSPredicate фильтрация - PullRequest
7 голосов
/ 08 декабря 2011

Я пытаюсь отфильтровать мой массив с двумя объектами внутри объекта, как у меня есть объект Person, в котором у меня есть имя, адрес, номер, адрес электронной почты и т. Д. Я пытаюсь отфильтровать список объектов массива только с именем ичисло.Как этого добиться с помощью NSPredicate?

Ответы [ 4 ]

13 голосов
/ 08 декабря 2011

Создайте предикат (в следующем предполагается, что у вашего Person класса есть свойства строки name и number):

NSString *nameFilter = @"Steve*";
NSString *numberFilter = @"555-*";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];

Затем отфильтруйте массив (предполагается, что у вас есть NSArray из Person объектов):

NSArray *personArray = /* obtain from somewhere */;
NSArray *filtered = [personArray filteredArrayUsingPredicate:pred];

Результатом будет массив, содержащий Person объектов, name которых может быть & ldquo; Steve & rdquo ;, & ldquo; Steven & rdquo; и т. д., номер которого начинается с 555-.

Редактировать

То, что вы говорите, на самом деле не имеет смысла. Вы не можете удалить свойства из класса (или, скорее, вы не должны ). Если вам нужен только массив, содержащий только имена и числа, вам придется перебирать массив объектов Person:

NSMutableArray *result = [NSMutableArray array];

for (Person *p in personArray)
    [result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]];
4 голосов
/ 08 декабря 2011

Я полагаю, что вы ищете:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name];

или если вы хотите подобия для имен строк, вы также можете использовать:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];

и предполагая, что номер телефона является просто int,Вы можете использовать ==, <, <= и т. д. для сравнения чисел </p>

, а затем применить его с:

NSArray * filteredarray  = [array filteredArrayUsingPredicate:predicate];
1 голос
/ 15 июля 2013

Я предпочитаю использовать слово CONTAINS для фильтрации.Это легко сделать эту работу.Или вы можете объединить их вместе:

NSPredicate * predicate =
 [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];

Вы можете сослаться на OFFICIAL DOC :

BEGINSWITH: левое выражение начинается сручное выражение.

СОДЕРЖИТ: Левое выражение содержит правое выражение.

ENDSWITH: левое выражение заканчивается правым выражением.

LIKE: левое выражение равно правому выражению:?и * разрешены в качестве символов подстановки, где?соответствует 1 символу, а * соответствует 0 или более символам.

МАТЧИ: Левое выражение равно правому выражению с использованием сравнения в стиле регулярных выражений в соответствии с ICU v3 (более подробную информацию см. В Руководстве пользователя ICU для регулярных выражений).

0 голосов
/ 01 июня 2017
NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];

NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];

feedType - это свойство пользовательского объекта для сравнения, а arrayTotalFeed - массив пользовательских объектов.

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