【问题标题】:Swift: How many of the same object in arraySwift:数组中有多少相同的对象
【发布时间】:2019-05-28 08:38:30
【问题描述】:

我有一个 CollectionView,其中包含...

Fruit(name: String, price: Int, imageUrl: String)

用户可以选择多个Fruits,然后进行“结帐”,这是一个UITableView,并选择了所有水果。 UITableViewCell 包含:amountLabelfruitLabelpriceLabel

我想在这个视图中显示每种水果的数量和总价格。

最好的方法是什么?

我现在看到的:

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$

【问题讨论】:

  • 你应该将你的 Fruit 包装在一个 Order 结构体中,并在添加相同水果时增加一个 int 计数器,而不是存储一个单独的水果。然后,您还可以在 Order 结构中拥有一个计算属性,该属性返回总金额。 Order 对象可以存储在以水果或水果名称为键的字典中
  • @JoakimDanielson 他想用这个数据源做到这一点。这是他的问题。
  • @RakeshaShastri 我将此作为评论发布,而不是作为完全不同的答案,因此我认为我可以提出替代路线供 OP 考虑。

标签: arrays swift uitableview


【解决方案1】:

您可以对数组进行分组并总结价格

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)$")

【讨论】:

  • 啊,是的,我知道NSCountedSet 有一个 Swifty 替代方案,但我不记得它是什么了。这是一个比我更好的答案:)
  • 这是一个很好的答案。抱歉回复晚了,但我试图用给定的信息填充单元格。我创建了一个新类FilteredFruits() 和一个新数组[filteredFruits](),在print(value.count... 之后我还做了filteredFruits.append(Fruit(amount: value.count, name: key, price: price) ,然后用filteredFruits[indexPath.row].name 等填充单元格。这是继续的正确方法吗?谢谢
  • 如果这是你所期望的,是的。
【解决方案2】:

这是NSCountedSet 的完美案例。

You can see the documentation for NSCountedSet here.

您可以创建一个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 作为行数。

【讨论】:

  • 你能把它用作表格视图的数据源吗?
  • 好的。让我重述一下。他可以使用它来获取表格视图以轻松地显示他想要的结果吗? (他问题的最后一部分)
  • 我在问这是否可以作为表格视图的数据源来轻松实现他所需的结果格式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2020-02-08
相关资源
最近更新 更多