Тип выражения неоднозначен без дополнительного контекста при использовании представления в функции ForEach SwiftUI

#swiftui

#swiftui

Вопрос:

Я продолжаю получать эту ошибку, кажется, я не могу понять это, когда я извлекаю return, он по-прежнему выдает мне Не удалось произвести диагностику для выражения; пожалуйста, отправьте сообщение об ошибке ошибка

 struct DailyLogView: View {
  
    
    @State var Meals : [meal]
    var columns = Array(repeating: GridItem(.flexible(),spacing: 20), count: 2)
    
    var body: some  View {
      return ZStack{ //error here 
        
            LazyVGrid(columns: columns, spacing: 30){
          
                ForEach ( Meals ){ meal in
               
                    VStack(alignment: .leading, spacing: 15){
                    
                    
                        MealCardView( mealName: meal?.Name, totalCalories: meal?.totalCalories, mealTime: meal?.Time, mealImage: meal?.Image)
                    
                    }
                }
            }
        }
    }
}

  

Я убедился, что структура соответствует идентифицируемому типу

 

 struct meal : Identifiable {
    
    var id = UUID()
    var Name : String
    var Time : String
    var totalCalories : Int
    var Image : String

}

  

Ошибка не возникает, когда я не использую MealCardView, поэтому я думаю, что это может быть связано с этим.

 struct MealCardView: View {
    
    
    @Binding var mealName:String
    @Binding var totalCalories:Int
    @Binding var mealTime:String
    @Binding var mealImage:String
    
    var body: some View {
        ZStack{
            HStack{
                VStack{
                    Text(self.mealName)
                        .bold()
                        .foregroundColor(.white)
                    Text("Calories:(self.totalCalories)")
                        .foregroundColor(.white)
                }
            }
        }
        .padding(10)
        .background(Color.blue)
        .cornerRadius(20)
    }
}
  

Комментарии:

1. MealCardView ожидает привязку к значению, но вы передаете ему значение напрямую. Кроме того, я настоятельно рекомендую вам придерживаться языкового соглашения и указывать типы имен с заглавной буквы, например struct Meal {...} , и переменные / свойства выделяются: var meals: [Meal]

2. Как мне передать MealCardView привязку в этом ForEach?

Ответ №1:

MealCardView ожидается привязка к значению, поэтому вам нужно передать привязку к элементу массива.

Вы можете сделать это, выполнив итерацию по индексам массива, а затем использовать прогнозируемое значение индекса массива (которое является привязкой) к элементу.

Во-первых, я предлагаю вам придерживаться соглашения об именовании Swift и изменить ваши типы на заглавные буквы, а свойства / переменные — на camelCased:

 struct Meal: Identifiable {
    var id = UUID()
    var name : String
    var time : String
    var totalCalories : Int
    var image : String
}
  

Кроме того, вместо передачи свойств по одному, вы можете просто передать всю Meal переменную

 struct MealCardView: View {
   @Binding var meal: Meal
   // ...
}

struct DailyLogView: View {
   @State var meals: [Meal]

   var body: some View {
      
      ForEach(meals.indices, id: .self) { index in
         MealCardView(meal: self.$meals[index])
      }

   }
}
  

Конечно, если вы настаиваете на передаче свойств по одному, это также возможно, хотя и излишне подробно : self.$meal[index].totalCalories .