【问题标题】:SwiftUI duplicate in struct and delete and merge them by quantitySwiftUI 在结构中重复并按数量删除和合并它们
【发布时间】:2021-12-20 17:53:58
【问题描述】:

请帮帮我 我附有以下结构和照片。 我想找到重复的饮料然后删除重复的并通过添加一个来更改原始饮料的数量

    var id = UUID()
    var name : String
    var price : Double
    var extra : [DrinkExtra]
    var unit : Int
    var date : Date
} 

我尝试了以下代码,但产生了错误和超出范围的索引,并且没有发生任何魔法。

    func mergeItem(){
     
        for i in cartDrinks.indices.sorted(by: { name1, name2 in
            return cartDrinks[name1].name > cartDrinks[name2].name
        }) {
            if cartDrinks[i].name == cartDrinks[i + 1].name {
                cartDrinks[i].unit += 1
                cartDrinks.remove(at: i + 1)
                print("\(cartDrinks[i].name) \(cartDrinks[i].unit)")
            } else {
                print("Nothing found")
            }
        }
        
    }

非常感谢提前

【问题讨论】:

  • 要考虑的另一种方法是重构代码,以便为饮料本身提供一种类型(例如 Drink)和一种跟踪为饮料选择的单位的类型(例如 DrinkCounter)。这样,您可以保持 Drink 对象不变,并且仅在 UI 更改时增加/减少 DrinkCounter 对象中的计数器
  • 我有饮料的要求字符串,例如两杯可乐,一杯不加冰,另一杯加冰。如果没有要求,我想合并在一起,否则在打印机时单独打印。
  • 好的,你也可以将额外的东西移到 DrinkCounter(也许更好的名字是 DrinkOrder),这样 Drink 仍然是不可变的。
  • 我设法根据帖子找到了重复值,但是我不知道如何将其应用于我自己的问题???????????????? . my 是一个结构类型。这是来自其他 stackoverflow 帖子的代码 let crossReference = Dictionary(grouping: cartDrinks) { element in return element.name } let duplicates = crossReference .filter{$1.count > 1 } .flatMap{($0.1)} print(duplicates)

标签: swift xcode swiftui


【解决方案1】:

最后我有以下代码来完成我想要的任务。 非常感谢

    func mergeItem(complete:() -> Void) {
        
        var arr = cartDrinks
        var alacartarr = cartexpress
        arr.enumerated().forEach { index,item in
            if let existIndex = arr.firstIndex(where: {item.name == $0.name }),
               existIndex != index {
                arr[existIndex].unit += arr[index].unit
                arr[index].unit = 0
        }
    }
        arr.removeAll(){$0.unit == 0}
        self.cartDrinks.removeAll()
        self.cartDrinks.append(contentsOf: arr)
        
        alacartarr.enumerated().forEach { index,value in
            if let existedIndex = alacartarr.firstIndex(where: {value.name == $0.name}),
               existedIndex != index {
                alacartarr[existedIndex].quantity += alacartarr[index].quantity
                alacartarr[index].quantity = 0
            }
        }
        alacartarr.removeAll(){$0.quantity == 0}
        cartexpress.removeAll()
        cartexpress.append(contentsOf: alacartarr)
        
        complete()
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2021-06-19
    • 2010-10-19
    • 2018-03-11
    • 2015-01-01
    • 2019-04-30
    相关资源
    最近更新 更多