Может кто-нибудь сказать, чистый и эффективный способ заполнения tableView с массивом словарей?У меня есть модель Sale
, которая содержит saleAmount, soldBy, Division, saleDate.Каждое подразделение может содержать много данных о продажах и хотеть разделить данные о продажах по каждому подразделению.Кроме того, в заголовке tableView я хочу отобразить название подразделения вместе с общим объемом продаж по конкретному подразделению
class Sale {
var saleAmount : Double = 0.00
var soldBy : String = ""
var division : String = ""
var saleDate : Date?
}
Я получаю данные и сохраняю их в
var sales : [Sale] = [Sale]()
, а затемЯ обрабатываю данные в словарь для каждого «деления»
var salesDict : [String : Sale] = [String : Sale] ()
func createIndex<Key, Element>(elms:[Element], extractKey:(Element) -> Key) -> [Key:Element] where Key : Hashable {
return elms.reduce([Key:Element]()) { (dict, elm) -> [Key:Element] in
var dict = dict
dict[extractKey(elm)] = elm
return dict
}
}
salesDict = createIndex(elms: sales, extractKey: {$0.division})
salesSection = salesDict.compactMap(){$0.key} // To store keys
print(saleDict) // ["division1": Clientname.Sale, "division2": Clientname.Sale, "division3": Clientname.Sale, "division4": Clientname.Sale]
и заполняю tableView
func numberOfSections(in tableView: UITableView) -> Int {
return salesSection.count
}
Данные заполнены неправильно
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return [salesDict[salesSection[section]]?.soldBy].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let saleItem = salesDict[salesSection[indexPath.section]]
let cell = tableView.dequeueReusableCell(withIdentifier: "FoldingCell", for: indexPath) as! SaleHistoryTableViewCell
cell.saleAmountLabel.text = ("\(String(describing: saleItem?.saleAmount))")
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return salesSection[section]
}