Использование предикатов

Cocoa

Оценка предикатов

Чтобы оценить предикат, можно использовать NSPredicate метод evaluateWithObject: и передать объект, относительно которого предикат будет оцениваться. Этот метод возвращает логическое значение, в следующем примере, результат будет YES.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@",
    [NSArray arrayWithObjects:@"Stig", @"Shaffiq", @"Chris", nil]];
BOOL result = [predicate evaluateWithObject:@"Shaffiq"];

Вы можете использовать предикаты с любымы классами объекта, но класс должен поддерживать кодирование ключ-значение для ключей, которые вы хотите использовать в предикате.

Использование предикатов с массивами

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

NSMutableArray *array =
    [NSMutableArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];
// beginWithB содержит { @"Adam" }.

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'e'"];
[array filterUsingPredicate:sPredicate];
// array теперь содержит { @"Miguel", @"Ben", @"Melissa" }

Использование предикатов с ключ-путем

Напомним, что вы можете следить за отношениями в предикате с помощью ключа пути. Следующий пример иллюстрирует создание предиката для поиска сотрудников, которые принадлежат к отделу с заданным наименованием

NSString *departmentName = ... ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
        @"department.name like %@", departmentName];

Если вы используете связи один ко-многим, построение предиката, немного отличается. Если вы хотите получать департаменты, в которых по крайней мере, один из сотрудников имеет, например, имя "Matthew", можно использовать любой оператор, как показано в следующем примере:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ANY employees.firstName like 'Matthew'"];

Если вы хотите найти отделы, в которых по крайней мере, один из сотрудников получает больше, чем определенное количество, можно использовать любой оператор, как показано в следующем примере:

float salary = ... ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ANY employees.salary > %f", salary];

Null значения

Сравнение предиката не соответствует ни одному нулевому значению, за исключением нулевого (nil) или NSNull нуль значение (то есть, ($value == nil) возвращает YES, если $value равно nil). Рассмотрим следующий пример.

NSString *firstName = @"Ben";

NSMutableArray *array = [NSMutableArray array];
[array addObject:
    [NSDictionary dictionaryWithObject:@"Turner" forKey:@"lastName"]];
[array addObject:
    [NSDictionary dictionaryWithObjectsAndKeys:@"Ben", @"firstName",
        @"Ballard", @"lastName",
        [NSDate dateWithString:@"1972-03-24 10:45:32 +0600"], @"birthday", nil]];

NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"firstName like %@", firstName];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];

NSLog(@"filteredArray: %@", filteredArray);
// Выводится:
// filteredArray ({birthday = 1972-03-24 10:45:32 +0600;
// firstName = Ben; lastName = Ballard; })

Предикат соответствует словарю, который содержит значение Ben для ключа firstName, но не соответствует словарю без значения ключа firstName. Следующий фрагмент кода иллюстрирует ту же точку, используя дату и больше, чем сравнитель.

NSDate *referenceDate = [NSDate dateWithTimeIntervalSince1970:0];

predicate = [NSPredicate predicateWithFormat:@"birthday > %@", referenceDate];
filteredArray = [array filteredArrayUsingPredicate:predicate];

NSLog(@"filteredArray: %@", filteredArray);
// Выводит:
// filteredArray: ({birthday = 1972-03-24 10:45:32 +0600;
// firstName = Ben; lastName = Ballard; })

Тестирование на Null

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

predicate = [NSPredicate predicateWithFormat:@"(firstName == %@) ||
   (firstName = nil)", firstName];

filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"filteredArray: %@", filteredArray);

// Выводит:
// filteredArray: ( { lastName = Turner; }, { birthday = 1972-03-23 20:45:32 -0800;
// firstName = Ben; lastName = Ballard; }

Подразумевается, что тест на нуль, при соответствии нулевому значению возвращает истину. В следующем фрагменте кода, ok установлен ​​в YES для предиката оценки.

BOOL ok;
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
ok = [predicate evaluateWithObject:[NSDictionary dictionary]];

ok = [predicate evaluateWithObject:
    [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"firstName"]];

Использование предикатов с Cocoa Bindings

Вы можете настроить предикат для массива контроллеров для фильтрации содержимого массива. Вы можете установить предикат в коде (с использованием setFilterPredicate:). Вы также можете связывать filterPredicate массива контроллеров для привязки к методу, который возвращает NSPredicate объект. Объект, который реализует метод может быть владельцем файла или другого объекта контроллера. Если вы измените предикат, помните, что вы должны сделать это с ключ-значением, соблюдая совместимый образ, так что массив контроллеров обновляет себя соответственно.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac