无法从列表中扣除总工资

Not able to deduct the gross pay from the list

在这段代码中,我输入了两个值,load1load2,并且通过添加 load1load2 来计算速率。总工资 gp 是通过将列表中的费率相加计算得出的。但是,当我删除列表中的任何负载时,它应该从总工资中减去相同的负载。相反,每次它减去的负载量与我最初删除的负载量相同。因此,当您使用编辑按钮删除它时,它只会从列表中删除负载。但是,从总工资中减去金额是不对的。

有人可以帮我解决这个问题吗?

struct Calculation: View {
    
    @State var load1 = Float()
    @State var load2 = Float()
    @State var gp : Float = 0
    @State var rate: Float = 0
    @ObservedObject var taskStore = TaskStore()
    
    func addNewToDo() {
        
        taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: =  \(rate.description)" ))
        
    }
    var body: some View {
        
        
        NavigationView {
            
            
            VStack {
                
                
                List {
                    
                    Section(header:Text("load 2"))
                    {
                        TextField("Enter value of load 1", value: $load1, format: .number)
                        
                        TextField("Enter value of load 1", value: $load2, format: .number)
                    }
                    
                    HStack {
                        Button(String(format: "Add Load"), action:
                                {
                            
                            print("pay for the shift is ")
                            print(Rocky(mypay: rate))
                            gp += rate
                        })
                        
                        Button(action: {addNewToDo(); Rocky(mypay: rate) }, label: {
                            Text(" ")
                            
                        })
                    }
                    
                    ForEach(self.taskStore.tasks) {
                        task in
                        Text(task.toDoItem)
                    }.onMove(perform : self.move)
                        .onDelete(perform : self.delete) //For each
                    
                }.navigationBarTitle("SHIFTS")
                    .navigationBarItems(trailing: EditButton()) //List
                Text("Gross Pay = $\(gp) ")
                
            }.onAppear()
            
        } }
    
    func Rocky(mypay: Float)
    { rate = load1 + load2
        print("Sus \(gp)")
        
    }
    func move(from source : IndexSet, to destination : Int)
    {
        taskStore.tasks.move(fromOffsets: source, toOffset: destination)
    }
    func delete(at offsets : IndexSet) {
        
        taskStore.tasks.remove(atOffsets: offsets)
        
        gp -= rate
    }
    
}

struct BlueTwoView_Previews: PreviewProvider {
    static var previews: some View {
        Calculation()
    }
}

这是另一个文件

struct Task : Identifiable {
    var id = String()
    var toDoItem = String()
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}

如果您在 Task 中存储 Float 而不仅仅是 String 值,则可以将其用于 gp 中的 add/subtract .最基本的变化看起来像这样(但是,在这样实施之前一定要检查答案的后半部分):

struct Task : Identifiable {
    var id = String()
    var toDoItem = String()
    var amount : Float = 0 //<-- Here
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}

struct Calculation: View {
    
    @State var load1 = Float()
    @State var load2 = Float()
    @State var gp : Float = 0
    @State var rate: Float = 0
    @ObservedObject var taskStore = TaskStore()
    
    func addNewToDo() {
        taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: =  \(rate.description)", amount: rate))
    }
    
    var body: some View {
        NavigationView {
            VStack {
                List {
                    
                    Section(header:Text("load 2"))
                    {
                        TextField("Enter value of load 1", value: $load1, format: .number)
                        TextField("Enter value of load 1", value: $load2, format: .number)
                    }
                    
                    HStack {
                        Button(String(format: "Add Load"), action: {
                            print("pay for the shift is ")
                            print(Rocky(mypay: rate))
                            gp += rate
                        })
                        
                        Button(action: {
                            addNewToDo()
                            Rocky(mypay: rate)
                        },
                        label: {
                            Text(" ")
                        })
                    }
                    
                    ForEach(self.taskStore.tasks) { task in
                        Text(task.toDoItem)
                    }
                    .onMove(perform : self.move)
                    .onDelete(perform : self.delete) //For each
                    
                }
                .navigationBarTitle("SHIFTS")
                .navigationBarItems(trailing: EditButton()) //List
                
                Text("Gross Pay = $\(gp) ")
                
            }.onAppear()
            
        }
    }
    
    func Rocky(mypay: Float)
    {
        rate = load1 + load2
        print("Sus \(gp)")
    }
    func move(from source : IndexSet, to destination : Int)
    {
        taskStore.tasks.move(fromOffsets: source, toOffset: destination)
    }
    func delete(at offsets : IndexSet) {
        if let index = offsets.first {  //<-- Here
            let task = taskStore.tasks[index]
            gp -= task.amount
        }
        taskStore.tasks.remove(atOffsets: offsets)
    }
}

此外,您可以重构代码,使 gp 不是 @State,而是计算出的 属性。然后,它只反映 Task 列表中的总金额——列表更改时无需手动 addition/calculations。同样,String toDoItem 可能是 Task.

上的计算 属性
struct Task : Identifiable {
    var id = String()
    var amount : Float = 0
}

extension Task {
    var toDoItem: String {
        "Earning: =  \(amount)"
    }
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}

struct Calculation: View {
    
    @State var load1 = Float()
    @State var load2 = Float()
    @State var rate: Float = 0
    @ObservedObject var taskStore = TaskStore()
    
    var gp : Float {
        taskStore.tasks.reduce(0) { acc, item in
            acc + item.amount
        }
    }
    
    func addNewToDo() {
        taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), amount: rate))
    }
    
    var body: some View {
        NavigationView {
            VStack {
                List {
                    
                    Section(header:Text("load 2"))
                    {
                        TextField("Enter value of load 1", value: $load1, format: .number)
                        TextField("Enter value of load 1", value: $load2, format: .number)
                    }
                    
                    HStack {
                        Button(String(format: "Add Load"), action: {
                            print("pay for the shift is ")
                            print(Rocky(mypay: rate))
                        })
                        
                        Button(action: {
                            addNewToDo()
                            Rocky(mypay: rate)
                        },
                               label: {
                            Text(" ")
                        })
                    }
                    
                    ForEach(self.taskStore.tasks) { task in
                        Text(task.toDoItem)
                    }
                    .onMove(perform : self.move)
                    .onDelete(perform : self.delete) //For each
                    
                }
                .navigationBarTitle("SHIFTS")
                .navigationBarItems(trailing: EditButton()) //List
                
                Text("Gross Pay = $\(gp) ")
                
            }.onAppear()
            
        }
    }
    
    func Rocky(mypay: Float)
    {
        rate = load1 + load2
        print("Sus \(gp)")
    }
    func move(from source : IndexSet, to destination : Int)
    {
        taskStore.tasks.move(fromOffsets: source, toOffset: destination)
    }
    func delete(at offsets : IndexSet) {
        taskStore.tasks.remove(atOffsets: offsets)
    }
}