ios - 我如何设置一个 NSPredicate 来总结 iOS 字典数组中字典中的属性值?

标签 ios swift nspredicate

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

注意:answer 必须是 NSPredicate 对象的格式参数中使用的单个字符串。如: var pred1:NSPredicate = NSPredicate.init(格式:*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 初始化格式字符串。但那是一个实现细节;别担心,因为其他人可能出于与我不同的原因需要相同类型的初始化。

最佳答案

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

  • mapamount 值放入数组
  • reduce 添加值

let payments = ticketState["payments"] as! [[String:AnyObject]]
let amountSum = payments.map{$0["amount"] as! Double}.reduce(0, combine: {$0 + $1})

关于ios - 我如何设置一个 NSPredicate 来总结 iOS 字典数组中字典中的属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34921086/

相关文章:

swift - 在 Swift 中对数组对象使用谓词会返回错误

iOS 将来自 URL 的音频分成帧

ios - 以编程方式在 UITableViewCell 中制作 UIButton 时出现问题

iphone - 请求苹果在iOS中使用功能?

ios - 在 iOS 上使用 HEVC 编码器输出巨大的视频

swift - 多个文件播放器上的 Core Audio 声音计量

iphone - NSPredicate:如何在过滤器中插入特殊字符(@$&)

ios - 一起解析数组的每个元素 - iOS

iOS 检查 iCloud 存储中的零值

ios - 如何为 View Controller 中的单个按钮创建两个 segue?