【问题标题】:Finding transactions total filtered by dates in range in CoreData在 CoreData 中查找按日期过滤的交易总数
【发布时间】:2022-11-17 09:11:43
【问题描述】:

提前谢谢大家。我是新来的斯威夫特用户界面.我正在尝试查找使用 CoreData 过滤的日期的交易总数@ fetch 按月显示月份按名称销售总额作为当月分组交易时该月的部分标题。

交易实体具有名称、日期和金额属性。如何在 groupTransactionsByMonth 函数中为 ViewModel 中部分的标题标签计算每个月的总和。 这是我的代码

typealias TransactionGroup = OrderedDictionary<String, 
[Transaction]>

class: ViewModel: NSObject, ObservableObject {

    @Published var transactions = [Transaction]()

    func groupTransactionsByMonth()->TransactionGroup{
        guard !transactions.isEmpty else {return[]}
        let groupedTransactions = Transaction(grouping: transactions, by: {"\ ($0.date?.formatted(.dateTime.year().month(.wide)) ?? "")"})
        return groupedTransactions
    }
}

我在groupTransactionsByMonth 函数中试过这个:

for(_, value) in groupedTransactions{
    var total: Double = 0
    for transaction in value {
        total += transaction.amount
        return total
    }
}

但它给出了一个错误

无法将返回表达式 0f 类型“Double”转换为返回类型 'TransactionGroup(又名 'OrderedDictionary<String, 数组>')

@Edit1

at moment I am showing my transactions in forEach as following
@ObservedObject private var vm = ViewModel()
ForEach(Array(vm.groupTransactionsByMonth()), id: \.key){month, 
transactions in
Section{
  ForEach(transactions){transaction in
     ReportCellView(date: transaction.date ?? Date(), name: 
transaction.name ?? "", amount: transaction.amount)
                } 
            } header { 
     HStack { Text(month)
              Spacer()
             //here I wanna show monthly total amount for 
posted month in section header not achieved yet
              //Text(" Sales")
              //Text("\(monthlyTotalSalesAmount)")
         }

【问题讨论】:

标签: arrays swift core-data ordereddictionary


【解决方案1】:
// assuming this is what your data structure looks like, adapt as needed
struct Transaction {
  let name: String
  let date: Date
  let amount: Double
}

// tuples for transactions & sum
typealias TransactionGroupByMonth = Dictionary<String, (transactions: [Transaction], sum: Double)>


class ViewModel: NSObject, ObservableObject {
  @Published var transactions = [Transactions]()
  
  func groupTransactionsByMonth() -> TransactionGroupByMonth {
    let groupByMonth = Dictionary(grouping: self.transactions) { transaction -> String in
      return Calendar.current.dateComponents([.month], from: transaction.date).month!.formatted()
    }

    return groupByMonth.reduce([:]) { partialResult, item in
      var result = partialResult
      result[item.key] = (transactions: item.value, sum: item.value.reduce(0.0, { $0 + $1.amount }))
      return result
    }
  }
}

例子:

let instance = ViewModel()
instance.transactions = [
  Transaction(name: "1", date: Date(), amount: 0.1),
  Transaction(name: "2", date: Date(), amount: 0.2),
  Transaction(name: "3", date: Date(), amount: 0.3),
]
let grouped = instance.groupTransactionsByMonth()
print(grouped)

/**
pseudo output structure:
{
  "11": {
    "transactions": [Transaction...],
    "sum": 0.6
  }
}
**/

我希望您没有成千上万的交易,因为这不是执行此操作的最有效方法。

【讨论】:

  • 你能帮我如何实现你的方法来修复我的 ForEach 以显示事务或将总和添加到我的 groupTransactionsByMonth() 函数中吗?我试图自己修复它但没有成功。我对在线社区的帮助感到惊讶,但我的案例没有太多样本。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2022-08-22
  • 1970-01-01
  • 2022-10-19
  • 2021-11-26
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多