根据.onDelete调整系统总计



下面的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)
}
}
}

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)

有关更多信息,请参阅函数文档。

我想明白了。我一次一个地单独测试了adjTotal调用中的参数,并在调用上方的代码中发现了两个错误。

cat是Int16,因为它存储在CoreData中。我在Int中添加了选角:let cat=Int(currTrans[index].entryCat(

value(money(是一个需要nil合并的String:let money=currTrans[index].moneyS"quot;

感谢pawello2222的帮助。

最新更新