Не может иметь условия в SwiftUI ForEach

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

В данный момент я изучаю SwiftUI. Я играл с загрузкой списка из CoreData и внесением изменений в / фильтрацию и т.д. Я столкнулся с проблемами, приведенными ниже. По сути, как только я пытаюсь применить какие-либо условия в ForEach I, я получаю сообщение об этой ошибке.

Это работает, если я выполняю итерацию по организациям в самом списке, а не по каждому. Это не идеальное решение, поскольку я теряю встроенную функцию удаления.

Я что-то глупое упускаю?

 let defaults = UserDefaults.standard

@EnvironmentObject var userData: UserData

@Environment(.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Organisation.entity(), sortDescriptors: [NSSortDescriptor(keyPath: Organisation.name, ascending: true)])
var orgs: FetchedResults<Organisation>


var body: some View
{
    NavigationView {
        
        List {
            
            ForEach(orgs, id: .self) {org in
                
                if !self.userData.showFavsOnly || org.isFavorite {
                    
                    NavigationLink(destination: OrganisationView(org: org, moc: self.managedObjectContext)) {
                        
                        OrganisationRow(org: org)
                        
                    }
                    
                }
                
            }
            
        }
        
    }
}
  

Там код ошибки, который я получаю, я получаю для каждой строки и является

 Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
  

Спасибо за вашу помощь

Ответ №1:

Тип ‘()’ не может соответствовать ‘View’; только типы struct / enum / class могут соответствовать протоколам

Эта ошибка означает, что ваш ForEach цикл ожидает некоторого представления. Но вместо этого вы даете ему if-statement . Что, если условие возвращает false?

Решение может заключаться в том, чтобы обернуть if-statement в какой-либо вид — это может быть Group , VStack ZStack

 ForEach(orgs, id: .self) { org in
    Group {
        if !self.userData.showFavsOnly || org.isFavorite {
            NavigationLink(destination: OrganisationView(org: org, moc: self.managedObjectContext)) {
                OrganisationRow(org: org)
            }
        }
    }
}