Вот настоящая причина, почему он не работает:
При создании строки, используя stringWithFormat:
, он собирается прийти выглядеть так:
@"engine like searchText"
Вы затем передать его predicateWithFormat:
, который будет видеть, что обе стороны левая и правая часть сравнения являются котируемые строки, что означает, что он будет интерпретировать их, как если бы они были keypaths.
При выполнении этого кода, это будет делать:
id leftValue = [object valueForKey:@"engine"];
id rightValue = [object valueForKey:@"searchText"];
return (leftValue is like rightValue);
Исключения получения выброшено Ваш объект жалуется, что он не имеет метод, названный «SearchText», который является правильным.
Контраст это, если вы вынули stringWithFormat:
вызов и просто поставить все прямо в predicateWithFormat:
:
NSPredicate *p = [NSPredicate predicateWithFormat:@"engine like %@", searchText];
predicateWithFormat:
умна. Он видит «aha, a%@
шаблон замены! Это означает, что я могу вывести аргумент из списка аргументов и поместить его в поле и использовать его как есть».Это именно то, что он собирается делать. Он должен вывести значение searchText
из списка аргументов, поместить его в NSExpression
и вставить его непосредственно в синтаксическое дерево выражений.
Самое интересное, что выражение, которое оно создает, будет постоянным значением. Это означает, что это буквальное значение; не ключевой путь, не коллекция и т. д. Это будет буквальная строка. Тогда при запуске ваш предикат, это будет делать:
id leftValue = [object valueForKey:@"engine"];
id rightValue = [rightExpression constantValue];
return (leftValue is like rightValue);
И что является правильным, и это также, почему вы не должны проходить через материал stringWithFormat:
перед передачей его в predicateWithFormat:
.
Исправить. Включение 'stringWithFormat:' является тем, что вызывало проблему. См. Мой ответ для полного объяснения. –