如何设置NSPredicate来汇总iOS中字典数组中字典内的属性值?

时间:2016-01-21 10:25:14

标签: ios swift nspredicate

问:如何设置 NSPredicate 来对iOS中词典数组中词典内的属性值求和?

注意:answer必须是NSPredicate对象的format参数中使用的单个字符串。如: var pred1:NSPredicate = NSPredicate.init(format: *ANSWER*)

假设我有以下字典:

var ticketState:Dictionary =
[
    "orderTotal":1.2,
    "payments":
    [
        [
            "authCode":"12345",
            "isVoid":"false",
            "amount":1.0
        ],
        [
            "authCode":"54321",
            "isVoid":"false",
            "amount":0.2
        ]
    ],
    "associatedWithReturn":false
]

现在我希望NSPredicate检查所有金额是否等于订单总额。

类似的东西:

var cond1:String = "sum($payments[].amount == $orderTotal)"

注意:我不能使用数组过滤或第二个谓词。

我可以像这样访问第一笔付款金额:

var cond1:String = "$payments[1].amount > 0" //works, returns true

这将返回true。我只想检查付款中所有金额的总和等于订单总数。这应该是由单个谓词定义的简单操作。

如何编写一个完成此操作的单行NSPredicate声明?

注意:有一个非常具体的原因我需要它作为单行,单个NSPredicate初始化格式字符串。但这是一个实施细节;不要担心,因为其他人可能有不同的理由需要相同类型的初始化。

3 个答案:

答案 0 :(得分:1)

var cond1:String = "$payments.@sum.amount == $orderTotal"

var pred1:NSPredicate = NSPredicate.init(format: cond1)
var rule1:GKRule = GKRule.init(predicate: pred1, assertingFact:"completeable", grade:1.0)
var ruleSys:GKRuleSystem = GKRuleSystem.init()

ruleSys.addRule(rule1)
ruleSys.state.addEntriesFromDictionary(ticketState)
ruleSys.evaluate()
print(ruleSys.facts)

返回["completeable"]

感谢sage444提供了引导我的提示。

换句话说:

夫特:

var pred1:NSPredicate = 
    NSPredicate.init(format:  "$payments.@sum.amount == $orderTotal")

目标C:

NSPredicate *pred1 = 
    [[NSPredicate alloc]initWithFormat:@"$payments.@sum.amount == $orderTotal"];

我的目的是初始化Apple GameplayKit GKRule对象,该对象将NSPredicate个对象作为参数。但是我认为它可以有许多其他应用程序。

答案 1 :(得分:1)

这是一个原生的Swift解决方案,用于内置函数

  • mapamount值放入数组
  • reduce添加值
let payments = ticketState["payments"] as! [[String:AnyObject]]
let amountSum = payments.map{$0["amount"] as! Double}.reduce(0, combine: {$0 + $1})

答案 2 :(得分:1)

使用以下代码获得总和

var totalAmount:Float = (ticketState.valueForKeyPath("payments.@sum.amount") as! NSNumber).floatValue;

现在你可以比较它或做你想做的任何事情。

对于其他相关运营商,如平均值,计数等,您可以通过以下链接查看其他收集运营商:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html