【问题标题】:Could not cast value of type '__NSTaggedDate' to 'NSNumber'无法将“__NSTaggedDate”类型的值转换为“NSNumber”
【发布时间】: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 是什么意思?

标签: ios swift


【解决方案1】:

带有.dictionaryResultType 的核心数据fetch 返回[[String:Any]]

返回数组的格式为:

[["dateDescr" : <date1>, "sumDescr" : <double1>], ["dateDescr" : <date2>, "sumDescr" : <double2>]]

映射键 sumDescr 的值并添加它们,捕捉潜在错误始终是良好的编程习惯:

do {
    let results = try context.fetch(request) as! [[String:Any]]
    let sum = results.map { $0["sumDescr"] as! Double }.reduce(0.0, +)
} catch {
    print(error)
}

【讨论】:

  • 哦,现在看到返回格式是有道理的。它现在正在工作。
猜你喜欢
  • 2016-01-22
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多