Вам необходимо разделить код пользовательского интерфейса и код модели данных. Я бы сделал что-то вроде создания объекта корзины, который содержит массив объектов продажи и предоставляет методы для таких операций, как добавление продажи, вычисление итогов, возврат информации для вашего tableView. Примерно так (пример, чтобы дать вам идею - не фактический скомпилированный код)
struct Basket{
struct Sale {
item: ItemType //be that a part number, name String, or whatever
quantity: Int
itemCost: Float
value: Float {return itemCost * Float(quantity)}
}
private var _totalValue: Float
private var basketItems: [Sale] = [] {
didSet {
_totalValue = basketItems.reduce(0){$0 + $1.value}
}
}
internal var totalValue: String {return String(format: "%.2f", _totalValue)}
internal func addSale(item: ItemType, quantity: Int, price: Float {
basketItems.append(Sale(item: item, quantity: quantity, itemCost: price))
}
internal func tableViewData(for row: Int) -> (name:String, quantity: String, Cost: String){
let sale = basketItems[row]
//sale items formatted as string as you wish, then return them in a tuple
return (s1, s2 s3)
}
И тогда вы можете просто создать Basket, как глобальную переменную, если вам это необходимо, хотя это не лучшая практика, и использоватьвидимые свойства / методы для добавления продаж или заполнения tableView, зная, что значения, которые вы получаете, будут надежными.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: .cellIdentifierBasketCell, for: indexPath) as? basketTableViewCell else {return.init()}
let cellStrings = basket.tableViewData(for: indexPath.row)
cell.itemTitleLabel.text = cellStrings.0
cell.quantityLabel.text = cellStrings.1
cell.itemPriceLabel.text = cellStrings.2
totalLabel.text = basket.totalValue
return cell
}