Swift 如何根据相同的id添加两行TableView

Swift 如何根据相同的id添加两行TableView,swift,uitableview,Swift,Uitableview,首先,我附上场景的图像: 我希望添加相同的子ID,并在一行中显示它们,同时添加它们的总数。应该有任何简单的数组附加或映射函数,我找不到。我的cellForRowAt indexath:如下所示: var walletTransactionModel = [WalletTransactionModel]() ... let cell = tableView.dequeueReusableCell(withIdentifier: "walletCell", for: index

首先,我附上场景的图像:

我希望添加相同的子ID,并在一行中显示它们,同时添加它们的总数。应该有任何简单的数组附加或映射函数,我找不到。我的cellForRowAt indexath:如下所示:

   var walletTransactionModel = [WalletTransactionModel]()
   ...

   let cell = tableView.dequeueReusableCell(withIdentifier: "walletCell", for: indexPath)
   let data = walletTransactionModel[indexPath.row - 1]
   let myNumber = doubleToIntWhenDecimalZero(number: data.amount)
   cell.textLabel?.text = "\(data.slug) | \(data.name) | \(myNumber)"
   return cell
import Foundation
import SwiftyJSON

class WalletTransactionModel {
var slug: String
var name: String
var amount: Double

required init(slug: String, name: String, amount: Double) {
    self.slug = slug
    self.name = name
    self.amount = amount
}

convenience init?(item: JSON) {
    guard let slug = item["slug"].string,
           let name = item["name"].string,
        let amount = item["amount"].double else { return nil}

    self.init(slug: slug, name: name, amount: amount)
}

}
我的简单模型如下所示:

   var walletTransactionModel = [WalletTransactionModel]()
   ...

   let cell = tableView.dequeueReusableCell(withIdentifier: "walletCell", for: indexPath)
   let data = walletTransactionModel[indexPath.row - 1]
   let myNumber = doubleToIntWhenDecimalZero(number: data.amount)
   cell.textLabel?.text = "\(data.slug) | \(data.name) | \(myNumber)"
   return cell
import Foundation
import SwiftyJSON

class WalletTransactionModel {
var slug: String
var name: String
var amount: Double

required init(slug: String, name: String, amount: Double) {
    self.slug = slug
    self.name = name
    self.amount = amount
}

convenience init?(item: JSON) {
    guard let slug = item["slug"].string,
           let name = item["name"].string,
        let amount = item["amount"].double else { return nil}

    self.init(slug: slug, name: name, amount: amount)
}

}

任何帮助都将不胜感激。

我认为最好的办法是在您尝试在表视图中显示数据之前,先将数据更正。加载数据后,运行一个处理步骤,将该数据缩减为所需的格式

类似的内容(复制粘贴到操场):

<代码>导入基础 类WalletTransactionModel{ 变量段塞:字符串 变量名称:String 风险价值金额:双倍 必需的初始化(slug:String,name:String,amount:Double){ self.slug=slug self.name=名称 self.amount=金额 } } var数据=[WalletTransactionModel(slug:“subID1”,name:“James”,amount:1), WalletTransactionModel(slug:“subID1”,姓名:“James”,金额:2), WalletTransactionModel(slug:“subID2”,姓名:“Sarah”,金额:10), WalletTransactionModel(slug:“subID2”,姓名:“Sarah”,金额:20)] var reducedData=data.reduce([WalletTransactionModel]()){(部分,模型)在 var部分=部分 让matchingIndex=partial.firstIndex(其中:{(existingModel)->Bool-in existingModel.slug==model.slug }) 如果让matchingIndex=matchingIndex{ 部分[matchingIndex].amount+=model.amount }否则{ 部分附加(模型) } 返回部分 } 对于简化数据中的模型{ 打印(“\(model.slug)\(model.amount)”) } 你也许可以更有效地做这件事,但希望你能清楚地知道到底发生了什么。基本上,它会减少现有数据,并在每个部分结果上检查id是否已添加到新结果中。如果有,则将金额相加,否则将模型添加到新结果中


这将处理您的数据,并创建一个新的数据数组。然后,您可以将其用作表视图数据源,在
cellforrowatinex
中,您无需执行任何操作,只需显示行。

我认为最好的做法是在尝试在表视图中显示数据之前,先更正数据。加载数据后,运行一个处理步骤,将该数据缩减为所需的格式

类似的内容(复制粘贴到操场):

<代码>导入基础 类WalletTransactionModel{ 变量段塞:字符串 变量名称:String 风险价值金额:双倍 必需的初始化(slug:String,name:String,amount:Double){ self.slug=slug self.name=名称 self.amount=金额 } } var数据=[WalletTransactionModel(slug:“subID1”,name:“James”,amount:1), WalletTransactionModel(slug:“subID1”,姓名:“James”,金额:2), WalletTransactionModel(slug:“subID2”,姓名:“Sarah”,金额:10), WalletTransactionModel(slug:“subID2”,姓名:“Sarah”,金额:20)] var reducedData=data.reduce([WalletTransactionModel]()){(部分,模型)在 var部分=部分 让matchingIndex=partial.firstIndex(其中:{(existingModel)->Bool-in existingModel.slug==model.slug }) 如果让matchingIndex=matchingIndex{ 部分[matchingIndex].amount+=model.amount }否则{ 部分附加(模型) } 返回部分 } 对于简化数据中的模型{ 打印(“\(model.slug)\(model.amount)”) } 你也许可以更有效地做这件事,但希望你能清楚地知道到底发生了什么。基本上,它会减少现有数据,并在每个部分结果上检查id是否已添加到新结果中。如果有,则将金额相加,否则将模型添加到新结果中


这将处理您的数据,并创建一个新的数据数组。然后,您可以将其用作表视图数据源,并且除了显示行之外,无需在
cellforrowatinex
中执行任何操作。

您可以使用
字典的
init(分组:按:)
slug>对
walletTransactionModel
元素进行分组,即

let grouped = Dictionary(grouping: walletTransactionModel, by: { $0.slug })
let arr = grouped.values.compactMap { (models) -> WalletTransactionModel? in
    if let name = models.first?.name, let slug = models.first?.slug {
        let amount = models.reduce(0) { $0 + $1.amount }
        let model = WalletTransactionModel(slug: slug, name: name, amount: amount)
        return model
    }
    return nil
}
现在,由于
grouped
[String:[WalletTransactionModel]]
类型的
字典
,我们需要进一步从
[WalletTransactionModel]
数组
中获得一个组合的
WalletTransactionModel
,作为
grouped
字典
中的
值,即

let grouped = Dictionary(grouping: walletTransactionModel, by: { $0.slug })
let arr = grouped.values.compactMap { (models) -> WalletTransactionModel? in
    if let name = models.first?.name, let slug = models.first?.slug {
        let amount = models.reduce(0) { $0 + $1.amount }
        let model = WalletTransactionModel(slug: slug, name: name, amount: amount)
        return model
    }
    return nil
}
arr
是基于
slug
组合
WalletTransactionModel
实例并添加相应的
金额后,类型为
[WalletTransactionModel]
数组

示例:

如果walletTransactionModel的定义为

let walletTransactionModel = [WalletTransactionModel(slug: "subID3", name: "Brian", amount: 10),
                              WalletTransactionModel(slug: "subID3", name: "Brian", amount: 12),
                              WalletTransactionModel(slug: "subID3", name: "Brian", amount: 15),
                              WalletTransactionModel(slug: "subID7", name: "Russel", amount: 10),
                              WalletTransactionModel(slug: "subID7", name: "Russel", amount: 11)]
然后
arr
将包含以下元素

[WalletTransactionModel(slug: "subID3", name: "Brian", amount: 37.0), WalletTransactionModel(slug: "subID7", name: "Russel", amount: 21.0)]

接下来,使用
tableView
arr
作为
dataSource
,以获得所需的UI。

您可以使用
字典的
init(分组:按:)
slug>对
walletTransactionModel
元素进行分组,即

let grouped = Dictionary(grouping: walletTransactionModel, by: { $0.slug })
let arr = grouped.values.compactMap { (models) -> WalletTransactionModel? in
    if let name = models.first?.name, let slug = models.first?.slug {
        let amount = models.reduce(0) { $0 + $1.amount }
        let model = WalletTransactionModel(slug: slug, name: name, amount: amount)
        return model
    }
    return nil
}
现在,由于
grouped
[String:[WalletTransactionModel]]
类型的
字典
,我们需要进一步从
[WalletTransactionModel]
数组
中获得一个组合的
WalletTransactionModel
,作为
grouped
字典
中的
值,即

let grouped = Dictionary(grouping: walletTransactionModel, by: { $0.slug })
let arr = grouped.values.compactMap { (models) -> WalletTransactionModel? in
    if let name = models.first?.name, let slug = models.first?.slug {
        let amount = models.reduce(0) { $0 + $1.amount }
        let model = WalletTransactionModel(slug: slug, name: name, amount: amount)
        return model
    }
    return nil
}
arr
是基于
slug
组合
WalletTransactionModel
实例后的
类型
[WalletTransactionModel]
数组