通过.onDelete调整系统总数

时间:2020-10-12 19:18:42

标签: swift swiftui

下面的listView结构显示coreData并使用onDelete删除coreData中的各个条目。显示coreData条目和删除条目都可以正常工作。当删除条目时,我想从类UserData(rateArray)中找到的系统总计中减去条目值。我在调用UserData方法adjTotal时遇到麻烦。如果我将所有参数都放入调用中,则会遇到大约六个错误,但是如果我首先将coreData参数减少为三个简单参数,则仍然会出现一个错误“表达式的类型是模棱两可的,没有更多上下文”。我猜想这个错误与非视图计算有关,但我不确定如何避免这种情况。 id,entryDsc,entryDT,entryCat,moneyS和rate是我的coreData实体CurrTrans的属性。

class UserData:  ObservableObject {
    
    var rateArray = [Double] ()

    func adjTotal( moneyS: String, rate: Double, cat: Int) -> () {
        var dq: Double = 0
        var moneyD: Double = 0
        
        moneyD = Double(moneyS) ?? 0.0
        dq = moneyD * rate
        totalArray[cat] -= dq
    }


struct listView: View {

    @EnvironmentObject var userData: UserData
    @Environment(\.managedObjectContext) private var viewContext
    
    var cat: Int = 0
    var money: String = ""
    var xchRate: Double = 0.0
    
    @FetchRequest(
        entity: CurrTrans.entity(),
        sortDescriptors: []
    ) var currTrans: FetchedResults<CurrTrans>

 var body: some View {

     NavigationView {
         List {
             ForEach(currTrans, id: \.self) { item in
                 VStack (alignment:.leading) {
                     HStack {
                            
                         if item.entryDT != nil {
                                Text(item.entryDT!.getFormattedDate())
                         }
                         Spacer()
                            
                         if item.moneyS != nil {
                             Text("\(item.moneyS!)")
                         }
                     }     
                     Text("Category: \(categories[Int(item.entryCat)])")
                        
                     if item.entryDsc != nil {
                         Text("\(item.entryDsc!)")
                     }
                  }
               }
               .onDelete { indexSet in
                   for index in indexSet {
                       viewContext.delete(currTrans[index])
                        
                       let cat = currTrans[index].entryCat
                       let money = currTrans[index].moneyS
                       let xchRate = currTrans[index].rate
                        
                       self.userData.adjTotal( money: String, xchRate: Double, cat: Int)
                   }
                   do {
                        try viewContext.save()
                   } catch {
                       print(error.localizedDescription)
                   }
               }
           }
           .navigationBarTitle("Entry Listing", displayMode: .inline)
       }
   }
}

2 个答案:

答案 0 :(得分:0)

adjTotal函数需要三个参数:

func adjTotal( moneyS: String, rate: Double, cat: Int)

但是,这是错误的-您不能只传递String(或其他类型):

self.userData.adjTotal( money: String, xchRate: Double, cat: Int)

您需要传递已经计算出的值:

let money = currTrans[index].moneyS
let xchRate = currTrans[index].rate
let cat = currTrans[index].entryCat

self.userData.adjTotal(money: money, xchRate: xchRate, cat: cat)

有关更多信息,请参见Functions的文档。

答案 1 :(得分:0)

我知道了。我一次测试了对adjTotal的调用中的参数,并在调用上方的代码中发现了两个错误。

cat是Int16,因为它存储在CoreData中。我在Int中添加了强制转换: 让cat = Int(currTrans [index] .entryCat)

值(money)是需要零合并的字符串: let money = currTrans [index] .moneyS? “”

感谢pawello2222的帮助。