如何设置 NSPredicate 来对 iOS 中的字典数组中的字典中的属性值求和?
How can I set up an NSPredicate to sum the values of properties inside dictionaries in an array of dictionaries in iOS?
问:如何设置 NSPredicate 来对 iOS 中的字典数组中的字典中的属性值求和?
注意:answer 必须是 NSPredicate 对象的格式参数中使用的单个字符串。如:
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
这将 return 为真。我只想检查付款中所有金额的总和是否等于订单总计。这应该是一个由单个谓词定义的简单操作。
如何编写单行 NSPredicate 声明来实现这一点?
注意:有一个非常具体的原因,我需要它是一个单行的、单一的 NSPredicate 初始化格式字符串。但那是一个实现细节;不用担心,因为其他人可能有与我不同的原因需要相同类型的初始化。
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)
Returns["completeable"]
。
感谢 sage444 给我的提示。
换句话说:
Swift:
var pred1:NSPredicate =
NSPredicate.init(format: "$payments.@sum.amount == $orderTotal")
Objective C:
NSPredicate *pred1 =
[[NSPredicate alloc]initWithFormat:@"$payments.@sum.amount == $orderTotal"];
我这样做的目的是初始化一个 Apple GameplayKit GKRule
对象,它以一个 NSPredicate
对象作为参数。但是我认为它可以有许多其他应用程序。
这是原生 Swift 解决方案,用于 built-in 功能
map
将 amount
值放入数组
reduce
添加值
let payments = ticketState["payments"] as! [[String:AnyObject]]
let amountSum = payments.map{[=10=]["amount"] as! Double}.reduce(0, combine: {[=10=] + })
使用以下代码求和
var totalAmount:Float = (ticketState.valueForKeyPath("payments.@sum.amount") as! NSNumber).floatValue;
现在您可以比较它或做任何您想做的事情。
其他相关运算符,如平均值、计数等,您可以在以下link:
查看其他集合运算符
问:如何设置 NSPredicate 来对 iOS 中的字典数组中的字典中的属性值求和?
注意:answer 必须是 NSPredicate 对象的格式参数中使用的单个字符串。如:
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
这将 return 为真。我只想检查付款中所有金额的总和是否等于订单总计。这应该是一个由单个谓词定义的简单操作。
如何编写单行 NSPredicate 声明来实现这一点?
注意:有一个非常具体的原因,我需要它是一个单行的、单一的 NSPredicate 初始化格式字符串。但那是一个实现细节;不用担心,因为其他人可能有与我不同的原因需要相同类型的初始化。
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)
Returns["completeable"]
。
感谢 sage444 给我的提示。
换句话说:
Swift:
var pred1:NSPredicate =
NSPredicate.init(format: "$payments.@sum.amount == $orderTotal")
Objective C:
NSPredicate *pred1 =
[[NSPredicate alloc]initWithFormat:@"$payments.@sum.amount == $orderTotal"];
我这样做的目的是初始化一个 Apple GameplayKit GKRule
对象,它以一个 NSPredicate
对象作为参数。但是我认为它可以有许多其他应用程序。
这是原生 Swift 解决方案,用于 built-in 功能
map
将amount
值放入数组reduce
添加值
let payments = ticketState["payments"] as! [[String:AnyObject]]
let amountSum = payments.map{[=10=]["amount"] as! Double}.reduce(0, combine: {[=10=] + })
使用以下代码求和
var totalAmount:Float = (ticketState.valueForKeyPath("payments.@sum.amount") as! NSNumber).floatValue;
现在您可以比较它或做任何您想做的事情。
其他相关运算符,如平均值、计数等,您可以在以下link:
查看其他集合运算符