NSPredicate поднимает «Неизвестный тип числа или nil, переданный в выражение арифметической функции».в плагине QuickLook - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть NSArray NSDictionary.У всех словарей есть ключ image-path.
. Я хочу получить отфильтрованный массив только словарей, которые соответствуют заданному значению (содержимое моей переменной path) для ключа image-path.

* 1006.* Я проверил структуру данных, которые у меня есть, используя эту строку (она печатает все значения словарей для ключевого пути изображения):
NSLog(@"array key paths: %@", [mountedImages valueForKeyPath:@"image-path"]);

Я использую этот код:

NSString *path = @"value-I-want-to-match";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(image-path LIKE[cd] \"%@\")", path];
NSArray *filteredArray = nil;
filteredArray = [mountedImages filteredArrayUsingPredicate:predicate];

Последняя строка вылетает и выдает следующую ошибку:

[ERROR] Computing 6571367.19831142 raised 'Unknown number type or nil passed to arithmetic function expression.'

Я делаю это в плагине QuickLook.Я могу пошагово пройти через мой код с помощью gdb, но, похоже, я ничего не нашел.Я получаю только:

[...]
[ERROR] Computing 6571367.19831142 raised 'Unknown number type or nil passed to arithmetic function expression.'
[Switching to process 23335 thread 0x8903]
[Switching to process 23335 thread 0xa703]
[Switching to process 23335 thread 0x8903]
Program ended with exit code: 0

1 Ответ

2 голосов
/ 03 февраля 2012

Вы должны удалить экранированные кавычки, которые вы поместили в строку формата предиката. Как указано в строковой ссылке на формат предиката Apple:

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

 NSString *attributeName = @"firstName";
 NSString *attributeValue = @"Adam";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue];

Строка формата предиката в этом случае оценивается как firstName, как "Адам".

Переменные с одинарными или двойными кавычками (или строки переменных подстановки) вызывают% @,% K или переменная $ должна интерпретироваться как литерал в строке формата и таким образом предотвращать любые замена. В следующем примере строка формата предиката оценивается как firstName как "% @" (обратите внимание на одинарные кавычки около% @).

 NSString *attributeName = @"firstName";
 NSString *attributeValue = @"Adam";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like '%@'", attributeName, attributeValue];

В вашем случае ваш предикат создается как image-path LIKE[cd] "%@", который не может быть правильно оценен при использовании для фильтрации вашего массива.

...