下面的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)
}
}
}
答案 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的帮助。