При использовании оператора 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. Также несколько необычно иметь функцию, плавающую за пределами представления, как вы подразумеваете в своих комментариях - она, вероятно, принадлежит внутри представления или внутри модели представления (трудно сказать, поскольку я не могу видеть весь ваш код).

Другие вопросы по тегам