Доступ к числовому ключу NSDictionary в NSPredicate - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь написать предикат для проверки определенного значения в словаре, который я настроил.

В этом словаре есть строковые версии "0", "1" и "2" в качестве ключей, к которым я хотел бы получить доступ.

Предикат, который я хотел бы написать:

$ player.currencyDictionaries.0.earned> 1000

Проблема в том, что .0 не допускается. Предполагая, что я не могу легко изменить, как словарь хранит значения (это в более старых версиях, и я хотел бы использовать один и тот же предикат во всех версиях, которые хранятся на сервере), есть ли какой-нибудь способ доступа к данным?

1 Ответ

2 голосов
/ 25 января 2012

IIRC, вы можете сделать это:

$player.currencyDictionaries[0].earned > 1000

(вам может потребоваться сделать ['0'], чтобы гарантировать, что переданное значение является строкой, а не числом)

Обратите внимание, чтоэтот синтаксис ([0]) только работает в строках формата предиката.Он не работает с ключевыми путями.

Этот синтаксис определен в разделе " Выражение индекса " в предикате BNF.


EDIT

На самом деле, это не сработает, и вот почему:

Строка "$player.currencyDictionaries[0].earned" будет прочитана и превращена в NSExpression типа NSKeyPathExpression.Это означает, что когда он вычисляется, он собирается взять эту строку и выполнить ее с помощью метода -valueForKeyPath: получателя.Как я упоминал выше, синтаксис скобок не работает с ключевыми путями, и, следовательно, это приведет к неправильному ответу.

Однако, поскольку вы знаете, currencyDictionaries возвращает NSDictionary, а с NSDictionary переопределяет метод -valueForKey: , вы можете превратить бит [0] в ключевой путь, превратив его в буквенную строку:

$player.currencyDictionaries.'0'.earned
...