我建议你创建一个项目数组的struct,而不是像这样的字典
struct Item{
var itemID : Int
var name : String
init(dictionary:[String:Any]) {
itemID = dictionary["itm_id"] as? Int ?? 0
name = dictionary["itm_name"] as? String ?? ""
}
}
一旦您拥有Items 的数组,您就可以将特定项目 ID 的元素映射为数组,以获取计数并将它们从数组中删除。看看下面的代码。不是最干净的实现,但它可以帮助您解决问题。
func countDuplicates(){
let dictionary = [["itm_id": 4, "itm_name": "Chicken"],["itm_id": 4, "itm_name": "Chicken"],["itm_id": 4, "itm_name": "Chicken"],["itm_id": 7, "itm_name": "Cat"]]
var items = [Item]()
var countArray = [[String:Any]]()
dictionary.forEach{
items.append(Item(dictionary: $0))
}
while items.count > 0 {
if let firstItem = items.first{
let duplicateItems = items.filter{$0.itemID == firstItem.itemID}
var countDictionary = [String:Any]()
countDictionary["itm_id"] = firstItem.itemID
countDictionary["count"] = duplicateItems.count
countArray.append(countDictionary)
items = items.filter{$0.itemID != firstItem.itemID}
}
}
print(countArray)
}
这将打印[["itm_id": 4, "count": 3], ["itm_id": 7, "count": 1]]
我假设Chicken、Cat 是字符串。如果它们不是字符串而是类类型,您可以将 Item 结构重写为类似这样的内容
class Animal{}
class Chicken:Animal{}
class Cat:Animal{}
struct Item<T:Animal>{
var itemID : Int
var name : String
var animal : Animal
init(dictionary:[String:Any],animal:T) {
itemID = dictionary["itm_id"] as? Int ?? 0
name = dictionary["itm_name"] as? String ?? ""
self.animal = animal
}
}
然后就可以像这样初始化Item了
yourItem = Item(dictionary:yourDictionary,animal:Cat())