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