Скорректировать общую сумму системы в результате .OnDelete

#swift #swiftui

#swift #swiftui

Вопрос:

Приведенная ниже структура ListView отображает CoreData и использует OnDelete для удаления отдельных записей в CoreData. Отображение записей CoreData и удаление записей работают нормально. При удалении записи я хотел бы вычесть значение записи из системного итога, найденного в классе UserData (rateArray). У меня возникли проблемы с моим вызовом моего метода пользовательских данных 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)
       }
   }
}
  

Ответ №1:

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)
  

Для получения дополнительной информации см. Документацию по функциям.

Комментарии:

1. если я изменю заголовок моего метода на func adjTotal( деньги: деньги, скорость: скорость, кошка: кошка) -> () { и вызову self.userData.adjTotal( деньги: деньги, xchRate: xchRate, кошка: кошка) Я получаю 3 ошибки для заголовка и одну для вызова. Если я изменю заголовок метода на func adjTotal(money: String, rate: Double, cat: Int) -> () { У меня только 1 ошибка для вызова — тот же, что и выше, Тип выражения неоднозначен без дополнительного контекста.

Ответ №2:

Я понял это. Я проверил параметры в вызове adjTotal по отдельности по одному и обнаружил две ошибки в коде над вызовом.

cat является Int16, поскольку он хранится в CoreData. Я добавил приведение к Int: пусть cat = Int(currTrans[index].entryCat)

Значение (деньги) представляет собой строку, которая нуждается в объединении с нулем: пусть money = currTrans[index].moneyS ?? «»

Спасибо pawello2222 за вашу помощь.