【问题标题】:Access numeric NSDictionary key in NSPredicate访问 NSPredicate 中的数字 NSDictionary 键
【发布时间】:2012-01-24 20:21:16
【问题描述】:

我正在尝试编写一个谓词来检查我设置的字典中的特定值。

这本词典有字符串版本的“0”、“1”和“2”作为我想要访问的键。

我想写的谓词是:

$player.currencyDictionaries.0.earned > 1000

问题是 .0 是不允许的。假设我不能轻易更改字典存储值的方式(这是在旧版本中,我想在所有版本上使用相同的谓词,因为它托管在服务器上)有什么方法可以访问数据?

【问题讨论】:

    标签: objective-c ios nsdictionary nspredicate predicate


    【解决方案1】:

    IIRC,你可以这样做:

    $player.currencyDictionaries[0].earned > 1000
    

    (您可能需要执行['0'] 以保证传递的值是字符串而不是数字)

    请注意,此语法 ([0])适用于谓词格式字符串。它不适用于关键路径。

    此语法在谓词 BNF 的“Index Expression”部分下定义。


    编辑

    实际上,这是行不通的,原因如下:

    字符串"$player.currencyDictionaries[0].earned" 将被读取并转换为NSKeyPathExpression 类型的NSExpression。这意味着,当它被评估时,它将基本上采用该字符串并通过接收器的-valueForKeyPath: 方法运行它。正如我上面提到的,括号语法不适用于关键路径,因此这会产生错误的答案。

    但是,由于您知道currencyDictionaries 返回一个NSDictionary,并且由于NSDictionary overrides the -valueForKey: method,您可以将[0] 位转换为键路径,方法是将其转换为文字字符串:

    $player.currencyDictionaries.'0'.earned
    

    【讨论】:

    • 根据stackoverflow.com/questions/1767374/hyphen-in-nsdictionary-key,我已经测试并验证了这样编写我的谓词是可行的:$player.currencyDictionaries.'0'.earned > 1000
    • 您的解决方案不适用于我的特定谓词,我得到了异常: Caught: -[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: list)
    • 我会回答我自己的问题,但由于我的评分,我不能回答。
    • 即使编辑了 ['0'] 我仍然遇到该异常。使用点语法和不带 [] 的 '0' 有效。
    • @M2tM 啊,这可能是因为它是关键路径表达式的一部分,而 [] 语法不适用于关键路径。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2016-03-11
    • 2016-01-22
    相关资源
    最近更新 更多