【问题标题】:Swift 3 Core Data - NSExpression forFunction: "sum:" throws error ("could not cast dictionary to Day")Swift 3 核心数据 - NSExpression forFunction:“sum:”抛出错误(“无法将字典转换为 Day”)
【发布时间】:2016-09-15 22:41:14
【问题描述】:

我有日子和任务。一天有很多任务。每个任务都有一个名为“积分”的属性,我想总结当天任务的所有积分。我使用了下面的代码(在 Core Data by tutorials, swift 2 版本中找到)并尝试为 swift 3 修改它(我还添加了一个谓词,但这并不重要)。但是当我运行这段代码时,我得到了这个错误:

无法将“NSKnownKeysDictionary1”(0x10d02d328) 类型的值转换为“MyProject.Day”

我做错了什么?

    // sum current day's task points 
    let sumRequest: NSFetchRequest<Day> = Day.fetchRequest()
    sumRequest.resultType = .dictionaryResultType

    sumRequest.predicate = NSPredicate(format: "SELF == %@", argumentArray: [Project.Days.current])

    let expressionDescription = NSExpressionDescription()
    expressionDescription.name = "sumOfPoints"
    expressionDescription.expression = NSExpression(forFunction: "sum:", arguments: [NSExpression(forKeyPath: "tasks.points")])
    expressionDescription.expressionResultType = .integer16AttributeType

    sumRequest.propertiesToFetch = [expressionDescription]

    do {
        let results = try managedObject.fetch(sumRequest) as! [NSDictionary] // Here's the line that causes the error
        print("DEN:", results)
    } catch let error as NSError {
        print("DEN:", error.localizedDescription)
    }

我认为这与这条线有关:

let sumRequest: NSFetchRequest<Day> = Day.fetchRequest()

在这里,我明确地说结果将是一天(我相信这是 swift 3 中的新功能?)。但我不知道如何才能改变这一点。

谢谢!

【问题讨论】:

    标签: swift core-data swift3


    【解决方案1】:

    这解决了我的问题:

    let sumRequest: NSFetchRequest<NSFetchRequestResult> = Day.fetchRequest()
    

    我没有将Day作为NSFetchRequestResult,而是将NSFetchRequestResult本身放在那里。现在它正在工作。

    我相信,当我将其设置为不同的 resultType 时,返回的不是 [Day],所以这就是为什么我需要将其更改为更通用或其他的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多