Отфильтруйте массив с помощью NSPredicate и получите новый объект, состоящий из некоторых элементов в запросе - PullRequest
0 голосов
/ 28 марта 2012

У меня есть такой массив

Word array (
    {
    translation =         (
                    {
            name = Roma;
            lang = it;
        },
                    {
            name = Rome;
            lang = en;
        }
    );
    type = provenance;
    value = RMU;
},
    {
    translation =         (
                    {
            name = "Milano";
            lang = it;
        },
                    {
            name = "Milan";
            lang = en;
        }
    );
    type = destination;
    value = MIL;
},)

Идея состоит в том, чтобы отфильтровать его с помощью NSPredicate и receive и массива словарей на основе ключа lang. Я бы хотел получить что-то подобное, отфильтровав lang == it,

Word array (
        {
            name = Roma;
            lang = it;
            type = provenance;
            value = RMU;
        },
        {
            name = "Milano";
            lang = it;
            type = destination;
            value = MIL;
        })

Я не могу упростить данные, потому что они получены из службы "JSON". Я пробовал разные предикаты, используя SUBQUERY, но ни один из них не работает, документация о SUBQUERY довольно скудная, я что-то упустил, возможно, проблема в том, что я хотел бы получить объект, который действительно отличается от источника.
Конечно, я могу получить перечисление этой структуры, мне интересно, есть ли более короткое решение
Этот ответ от Дейва Делонга ссылка на объяснение SUBQUERY дал мне много подсказок о SUBQUERY, но я не могу найти решение своей проблемы.
Может кто-нибудь дать мне подсказку о?

1 Ответ

1 голос
/ 28 марта 2012

Вы не можете сделать это с помощью предиката.(Ну, вы могли бы , но это было бы глупо сложно, трудно понять и поддерживать, и, в конце концов, было бы проще написать код самостоятельно)

NSPredicate предназначено дляизвлечение подмножества данных из существующего набора.Он только * выполняет фильтрацию, потому что предикат - это просто утверждение, которое оценивается как true или false.Если у вас есть коллекция и фильтр с предикатом, то что происходит, если коллекция начинает перебирать свои элементы и спрашивает предикат: «Это проходит ваш тест?»"это проходит ваш тест?"«это проходит ваш тест?» ... Каждый раз, когда предикат отвечает «да, это проходит мой тест», коллекция добавляет этот объект в новую коллекцию.Именно эта новая коллекция возвращается из метода фильтра.

THUS :

NSPredicate не позволяет (легко) объединить два набора данных (чтоэто то, что вы просите).Это возможно (поскольку с выражением FUNCTION() можно делать практически все, что угодно, но это делает невозможными для чтения предикаты.

SO :

используйте NSPredicate, чтобы объединить ваш набор данных.Сделай сам.

...