Home > Software design >  Swift - Problem with ForEach statement while structure is empty
Swift - Problem with ForEach statement while structure is empty

Time:02-19

I have a forEach statement that illiterates through a struct containing meal entries. If the struct is empty, I would like to display alternative Text.

My issue is when the array is empty, I receive the following error when compiling

Cannot convert value of type 'String' to expected argument type 'Meal'

  let mealEntrysDinner: [String] = [
        
    ]



 Section(header:Text("Dinner")){
               ForEach(mealEntrysDinner, id: \.self){ meal in
                   if(mealEntrysDinner.isEmpty == true){
                       Text("Arr Empty")
                   }
                   else{
                       EntryRow(meal:meal)
                   }
                  
               }
                
            }

Meal Structure below:

struct Meal: Identifiable, Hashable{
    var id = UUID()
    var mealName: String
    var calories: String
    var quantity: Int
    var amount: String
    var protein:  String
}

EntryRow

struct EntryRow: View {
    var meal: Meal
    var body: some View {
        HStack{
                        VStack(alignment: .leading){
                            Text(meal.mealName)
                            Text(meal.amount)
                                .font(.subheadline)
                                .foregroundColor(.gray)
                           
                        }
                        Spacer()
                        Text(meal.calories)
                }
            }
        }

CodePudding user response:

There are two issues.

First, it looks like you want mealEntrysDinner to be [Meal], not [String] -- otherwise, as you've discovered, the types don't match and you can't use EntryRow.

Secondly, you have something out-of-order with your if clause -- it should be outside the ForEach:

Section(header:Text("Dinner")){
    if mealEntrysDinner.isEmpty {
        Text("Arr Empty")
    } else {
        ForEach(mealEntrysDinner) { meal in
            EntryRow(meal:meal)
        }
    }
}

This way, the ForEach only gets displayed if mealEntrysDinner has elements.

  • Related