【发布时间】:2017-06-01 21:43:15
【问题描述】:
我有一个字典数组,其中包含一个 NSDate 键和一个 Double 值 ([NSDictionary]),我想计算所有值的总和,如下所示:
let sum = results.flatMap { $0.allValues.map { $0 as! Double } }.reduce(0, +)
但我收到了这个奇怪的错误:
Could not cast value of type '__NSTaggedDate' to 'NSNumber'
有人知道我的总和计算有什么问题吗?
编辑:
我得到的值来自 Core Data。这就是我检索它们的方式:
let amountExpr = NSExpression(forKeyPath: "amount")
let sumExpr = NSExpression(forFunction: "sum:", arguments: [amountExpr])
let sumDescr = NSExpressionDescription()
sumDescr.expression = sumExpr
sumDescr.name = "sumOfAmount"
sumDescr.expressionResultType = .doubleAttributeType
let dateExpr = NSExpression(forKeyPath: "date")
let dateDescr = NSExpressionDescription()
dateDescr.expression = dateExpr
dateDescr.name = "date"
dateDescr.expressionResultType = .dateAttributeType
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Transaction")
request.sortDescriptors = Transaction.defaultSortDescriptors
request.propertiesToFetch = [dateDescr, sumDescr]
request.propertiesToGroupBy = [dateDescr]
request.resultType = .dictionaryResultType
request.returnsObjectsAsFaults = false
request.predicate = Transaction.rangeOfDatesPredicate(dateRange: Date.week())
let results = try! context.fetch(request) as! [NSDictionary]
【问题讨论】:
-
给我们一个完整的例子。它适用于我使用
let results: [NSDictionary] = [NSDictionary(dictionary: [Date(): 9.9]), NSDictionary(dictionary: [Date(): 1.1])]; let sum = results.flatMap { $0.allValues.map { $0 as! Double } }.reduce(0, +); sum; // 11 -
好的,我已经编辑了我的问题。忘了说我的结果来自 Core Data。
-
Core Data 返回带有
String键的字典和 - 在您的情况下 -Date/Double值。映射数组以获取Double值并添加它们。顺便说一句,[[String:Any]]比[NSDictionary]好很多。 -
在 Playground 中不能这样做!看起来您可能需要转换 NSDictionary 的元素。也同意@Vadian - 尽可能避免
NSDictionary! -
@vadian:我不明白核心数据返回字符串作为键和日期/双精度值的部分。值是字典还是 Date / Double 是什么意思?