Swift 不同属性值的核心数据实体的值之和

Swift 不同属性值的核心数据实体的值之和,swift,core-data,Swift,Core Data,该函数计算每个标题的持续时间值之和。这是书面的,但我觉得可以通过计算获取期间的持续时间总和或更好地使用.map和.reduce并以某种方式删除for循环来改进 实体“记录”具有属性“endDate”、“duration”和“title”,这些属性是一对多的标题映射 如有任何见解,将不胜感激 以下是“记录”实体的示例数据集: [持续时间:35.5,结束日期:date(),标题:“阅读”] [持续时间:25.0,结束日期:date(),标题:“正在阅读”] [持续时间:20,结束日期:date(),

该函数计算每个标题的持续时间值之和。这是书面的,但我觉得可以通过计算获取期间的持续时间总和或更好地使用.map和.reduce并以某种方式删除for循环来改进

实体“记录”具有属性“endDate”、“duration”和“title”,这些属性是一对多的标题映射

如有任何见解,将不胜感激

以下是“记录”实体的示例数据集:

  • [持续时间:35.5,结束日期:date(),标题:“阅读”]
  • [持续时间:25.0,结束日期:date(),标题:“正在阅读”]
  • [持续时间:20,结束日期:date(),标题:“memrise”]
  • [持续时间:70,结束日期:date(),标题:“memrise”]
  • [持续时间:50,结束日期:(其他日期),标题:“memrise”]
  • 对于这些,谓词过滤掉第5个条目,函数返回

    ([“阅读”、“memrise”],[60.5,90])

    func GetAllTitleDurations(日期:date)->(标题:[字符串],持续时间:[双精度]){
    //日期扩展以获取日期的第一个和最后一个时刻
    让dateDayStart=date.startOfDay
    让dateDayNext=date.endOfDay
    变量持续时间:[双]=[]
    变量标题:[字符串]=[]
    //核心数据获取,谓词到今天
    让appDelegate=UIApplication.shared.delegate作为?appDelegate else{
    返回([],[])
    }
    让上下文=appDelegate.persistentContainer.viewContext
    let fetchRequest=NSFetchRequest(entityName:entityNames.Record.rawValue)
    fetchRequest.predicate=NSPredicate(格式:“(endDate>=%@)和(endDate<%@)”,dateDayStart为CVarArg,dateDayNext为CVarArg)
    做{
    let records=try context.fetch(fetchRequest)as![Record]
    //创建独特的标题
    titles=数组(Set(records.map{$0.title!}))
    我的头衔是{
    持续时间。追加(记录)
    .filter{$0.title==m}
    .reduce(0){$0+1.duration})
    }
    //标记:检查输出
    打印(持续时间)
    印刷品(标题)
    }将let错误捕获为NSError{
    打印(“无法获取.\(错误),\(错误.userInfo)”)
    返回([],[])
    }
    报税表(标题、期限)
    }
    
    您可以使用group by和字典结果在查询中完成所有操作。可能更简单的方法是将用于计算持续时间的n^^2算法折叠为:

    let result = records.reduce(into: [:]) { acc, record in
        acc[record.title, default:0.0] += record.duration
    }
    
    这将构建一个标题字典,总持续时间接近n次

    如果确实需要两个阵列,可以添加:

    .reduce(into: ([String](), [Double]())) {
        $0.0.append($1.key)
        $0.1.append($1.value)
    }
    

    您可以使用GROUPBY和字典结果在查询中完成这一切。可能更简单的方法是将用于计算持续时间的n^^2算法折叠为:

    let result = records.reduce(into: [:]) { acc, record in
        acc[record.title, default:0.0] += record.duration
    }
    
    这将构建一个标题字典,总持续时间接近n次

    如果确实需要两个阵列,可以添加:

    .reduce(into: ([String](), [Double]())) {
        $0.0.append($1.key)
        $0.1.append($1.value)
    }
    

    提供样本数据请添加样本数据-注意endDate只是一个日期变量。提供样本数据请添加样本数据-注意endDate只是一个日期变量。无论如何,哪种格式可能更适合生成的数据。但是,如果你真的想要两个数组,那么这也是一个非常简单的操作。不管怎样,哪种格式可能会更好地格式化结果数据。但是,如果您真的需要两个数组,那么这也是一个非常简单的操作。