使用@avg集合运算符为NSPredicate格式化字符串

时间:2013-05-03 12:38:40

标签: cocoa nspredicate kvc

有没有办法构建NSPredicate,以便可以通过大于5的平均分数过滤以下数组?

NSArray *objs = @[
@{@"scores":@[@3, @5, @2]},
@{@"scores":@[@5, @2, @8, @9]},
@{@"scores":@[@7, @1, @4]}
];

我尝试了各种组合,其中这个组合看起来最有希望(考虑到关键路径@avg.self通过普通KVC获取数组中数字的平均值):

NSPredicate *pred = [NSPredicate predicateWithFormat:@"scores.@avg.self > 5"];
NSArray     *filterd = [objs filteredArrayUsingPredicate:pred];

我得到的运行时错误如下:

NSUnknownKeyException',原因:'[< __ NSArrayI 0x10011b7c0> valueForUndefinedKey:]:此类不是键值avg的键值编码。

此谓词字符串有效:scores.@count > 3,因此至少可以在谓词中使用该集合运算符。

2 个答案:

答案 0 :(得分:1)

如果您将scores.@avg.self > 5更改为scores.@avg.doubleValue > 5,则可以正常使用。

答案 1 :(得分:0)

当@aLevelOfIndirection对您回复时,您需要将self替换为doubleValue,因为它是一个数字。

有一篇很好的文章解释了对你有用的收藏中的KVC操作符:http://nshipster.com/kvc-collection-operators/