Фильтр NSArray с 2D-NSDictionaries, используя NSPredicate - PullRequest
3 голосов
/ 06 сентября 2011

У меня есть NSArray, содержащий некоторые NSDictionaries, которые также включают NSDictionary.

NSDictionary *dict1 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict3 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"back" forKey:@"type"] forKey:@"image"];
NSDictionary *dict4 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];

NSArray *myArray = [NSArray arrayWithObjects:dict1, dict2, dict3, dict4, nil];

есть ли способ фильтрации myArray для всех словарей изображений, где тип f.e. «покрыть» с помощью NSPredicate?

пробовал предикаты, такие как

predicateWithFormat:@"(SELF.image.type == %@)", @"cover"]

или

predicateWithFormat:@"(image.type == %@)", @"cover"]

но безуспешно.

спасибо заранее! оставить комментарий, если что-то неясно

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

так

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.type == %@", @"cover"];

работает. но в моем случае я хочу отсортировать размер == оригинал. что я сделал, это

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.size == %@", @"original"];

но тогда мое приложение вылетает с

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSSymbolicExpression length]: unrecognized selector sent to instance

и указывает на мой filteredArrayUsingPredicate метод. я не вижу никакой разницы между типом и размером. см. мой NSLog моего массива здесь

 (
        {
        image =         {
            height = 1500;
            id = 4e5808765e73d607350059b4;
            size = original;
            type = poster;
            url = "someurl";
            width = 1000;
        };
    },
        {
        image =         {
            height = 750;
            id = 4e5808765e73d607350059b4;
            size = mid;
            type = poster;
            url = "someurl";
            width = 500;
        };
    },

кто-нибудь знает, почему происходит сбой, когда я пытаюсь использовать размер вместо типа?

Ответы [ 2 ]

6 голосов
/ 07 февраля 2012

РАЗМЕР - зарезервированное ключевое слово.

Находится внизу Руководство по программированию предикатов :

Зарезервированы следующие слова:

И, ИЛИ В, НЕ, ВСЕ, ЛЮБОЙ, НЕКОТОРЫЙ, НЕТ, НРАВИТСЯ, CASEINSENSITIVE, CI, спички, СОДЕРЖИТ, BEGINSWITH, ENDSWITH, МЕЖДУ, NULL, NIL, САМ, ИСТИНА, ДА, ЛОЖЬ, НЕТ, ПЕРВЫЙ, ПОСЛЕДНИЙ, РАЗМЕР, ЛЮБОЙ, ПОДПИСЬ, АКТЕРЫ, ТРЮПРЕДИКАТ, ФАЛЬСЕПРЕДИКАТ

2 голосов
/ 06 сентября 2011

У меня работал следующий код:

NSDictionary *dict1 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict3 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"back" forKey:@"type"] forKey:@"image"];
NSDictionary *dict4 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];

NSArray *myArray = [NSArray arrayWithObjects:dict1, dict2, dict3, dict4, nil];

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.type == %@", @"cover"];
NSLog(@"%@", [myArray filteredArrayUsingPredicate:p]);
...