#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 за вашу помощь.