#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
.