У меня есть CollectionView с такими элементами, как...
Fruit(name: String, price: Int, imageUrl: String)
Пользователь может выбрать несколько Fruits, а затем перейти к «кассе», которая представляет собой UITableView все выбранные фрукты.
UITableViewCell содержит: amountLabel, fruitLabel, priceLabel.
Я хочу показать, сколько каждого фрукта и общая цена в этом представлении.
Как лучше всего это сделать?
Что я вижу сейчас:
Banana - 1$
Orange - 3$
Banana - 1$
Apple - 2$
Apple - 2$
Banana - 1$
Orange - 3$
Orange - 3$
total: 16$
Что я хочу увидеть:
3x Banana - 3$
2x Apple - 4$
3x Orange - 9$
total: 16$
@JoakimDanielson, он хочет сделать это с этим источником данных. Это его вопрос.
@RakeshaShastri Я разместил это как комментарий, а не как ответ, который сильно отличается, поэтому я думаю, что мне разрешено представить альтернативный маршрут для рассмотрения OP.



Это идеальный случай для NSCountedSet.
Вы можете увидеть документацию для NSCountedSet здесь.
Вы можете создать NSCountedSet лайк...
let countedSet = NSCountedSet(array: fruits)
а затем получить информацию из него, как ...
countedSet.objectEnumerator.forEach {
let count = countedSet.count(for: $0)
print($0.name, count, count * $0.price)
}
Для просмотра таблицы вы можете использовать countedSet.objectEnumerator.allObjects.count для количества строк.
Можете ли вы использовать это как источник данных для табличного представления?
Ok. Позвольте мне перефразировать. Может ли он использовать это, чтобы табличное представление отображало результат так, как он хочет? (Его последняя часть вопроса)
Я спрашиваю, будет ли это работать как источник данных для представления таблицы, чтобы легко достичь требуемого формата результата?
Вы можете сгруппировать массив и просуммировать цены
let grouped = Dictionary(grouping: fruits, by: {$0.name})
var total = 0
for (key, value) in grouped {
let price = value.reduce(0, {$0 + $1.price})
print(value.count, key, "\(price)$")
total += price
}
print("total: \(total)$")
Ах да, я знал, что есть альтернатива Swifty NSCountedSet, но я не мог вспомнить, что это было. Это лучший ответ, чем мой :)
Это был отличный ответ. Извините за поздний ответ, но я пытался заполнить ячейки предоставленной информацией. Я создал новый класс FilteredFruits() и новый массив [filteredFruits](), а после print(value.count... я также сделал filteredFruits.append(Fruit(amount: value.count, name: key, price: price) , а затем заполнил ячейки filteredFruits[indexPath.row].name и т. д. Это правильный способ продолжить? Спасибо
Если это то, что вы ожидаете, то да.
Вы должны обернуть свой Fruit в структуру Order вместе со счетчиком int, который вы увеличиваете, когда тот же самый фрукт добавляется вместо хранения отдельного фрукта. Затем вы также можете иметь вычисляемое свойство в структуре Order, которое возвращает общую сумму. Объекты Order могут храниться в словаре с фруктом или названием фрукта в качестве ключа.