При использовании оператора if: тип '()' не может соответствовать 'View'; только типы struct/enum/class могут соответствовать протоколам
Я пытаюсь реализовать кнопку, которая активирует цикл ForEach, чтобы просмотреть каждый элемент в списке и пометить его как отложенный. Это мой код:
import SwiftUI
struct AllJobsDelayWeather: View{
var jobIndividualViewModel: JobIndividualViewModel
@State public var comparisonDate = getCurrentDate()
var body: some View{
let jobDate = ParserDate(date: jobIndividualViewModel.job.date)
Text(" ")
if jobIndividualViewModel.job.completed == false && jobDate == comparisonDate{ //error is here
jobIndividualViewModel.delayWeather(jobIndividualViewModel.job)
Text(" ")
}
Text(" ")
}
}
Это в «основной» (если можно так назвать) части программы.
Button("Delay Bad Weather"){
ForEach(jobViewModel.jobIndividualViewModels) { jobVM in
AllJobsDelayWeather(jobIndividualViewModel: jobVM)
}
}.padding()
Я получаю эту ошибку: Тип «()» не может соответствовать «Просмотр»; только типы struct / enum / class могут соответствовать протоколам. Функция работает и была протестирована специально. Я не знаю, как избавиться от ошибки, которую выдает компилятор.
ИЗМЕНИТЬ В настоящее время пытаюсь сделать это:
//in body
Button("Delay Bad Weather"){
ForEach(jobViewModel.jobIndividualViewModels) { jobVM
//errors getting thrown above
AllJobDelayWeather(jobVM: jobVM)
}
}.padding()
//outside if struct in the same file
func AllJobDelayWeather(jobVM: JobIndividualViewModel){
let comparisonDate = getCurrentDate()
let jobDate = ParserDate(date: jobVM.job.date)
if jobVM.job.completed == false && jobDate == comparisonDate{
jobVM.delayWeather(jobVM.job)
}
}
Теперь я получаю 2 экземпляра ошибки, один на F ForEach и {перед первым экземпляром jobVM.
1 ответ
Как упоминалось в комментариях, вы используете
ForEach
, который является представлением SwiftUI внутри Button
action
закрытие, где у вас не может быть просмотров. Глядя на ваш обновленный код, похоже, что вам просто нужен обычный forEach. Что-то типа:
Button("Delay Bad Weather") {
jobViewModel.jobIndividualViewModels.forEach { jobVM
allJobDelayWeather(jobVM: jobVM)
}
}.padding()
func allJobDelayWeather(jobVM: JobIndividualViewModel){
let comparisonDate = getCurrentDate()
let jobDate = ParserDate(date: jobVM.job.date)
if jobVM.job.completed == false && jobDate == comparisonDate{
jobVM.delayWeather(jobVM.job)
}
}
Я изменил имя вашей функции на нижний регистр, потому что это предпочтительное соглашение об именах в Swift. Также несколько необычно иметь функцию, плавающую за пределами представления, как вы подразумеваете в своих комментариях - она, вероятно, принадлежит внутри представления или внутри модели представления (трудно сказать, поскольку я не могу видеть весь ваш код).