Peço desculpas porque sou novo no SwiftUI -
Tenho uma classe (Meal) que contém um array de objetos de outra classe (Food). O que estou tentando fazer aqui é conseguir adicionar alimentos e ter essa atualização em uma lista, e então conseguir editar um alimento individual tocando nele.
Estou iterando pela lista de alimentos e usando cada alimento para (1) criar um NavigationLink e (2) simplesmente listar o nome do alimento na lista. O problema é que recebo o erro Initializer 'init(_:)' requires that 'Binding<String>' conform to 'StringProtocol'
quando tento referenciar o alimento de uma forma "unbound". Especificamente, no código abaixo, está na linha Text(food.name)
.
ForEach($meal.foods) { food in
NavigationLink(destination: FoodView(food: food)) {
Text(food.name)
}
}
Estou ciente de que poderia iterar por uma lista de índices em vez disso ( acho ), mas acho que isso provavelmente é uma prática ruim. Estou tentando descobrir qual é a melhor prática neste cenário. Obrigado antecipadamente!
Código completo abaixo:
// MARK: Views
struct ContentView: View {
@State private var day = Day()
var body: some View {
MealView(meal: $day.meals.first!)
}
}
struct MealView: View {
@Binding var meal: Meal
var body: some View {
NavigationStack {
List {
ForEach($meal.foods) { food in
NavigationLink(destination: FoodView(food: food)) {
Text(food.name)
}
}
}
}
}
}
struct FoodView: View {
@Binding var food: Food
var body: some View {
VStack {
TextField("Food", text: $food.name)
}
}
}
// MARK: Data
class Day {
var meals: [Meal] = [Meal()]
}
@Observable
class Meal: Identifiable {
var id: UUID = UUID()
var foods: [Food] = [Food(name: "Pizza"), Food(name: "Pasta"), Food(name: "Steak")]
}
@Observable
class Food: Identifiable {
var id: UUID = UUID()
var name: String
init(name: String) {
self.name = name
}
}
O erro diz
O que isso quer dizer é que o
Text
inicializador quer algo que esteja em conformidade comStringProtocol
eBinding<String>
não esteja;food
é umBinding<String>
. Você precisa acessar a string que está vinculada, o que pode ser feito com awrappedValue
propriedade da vinculação -@Binding
é somente para valores ou estruturas, não para classes que são@Observable
. Altere paralet
somente leitura e@Bindable
se você quiser obter uma ligação da propriedade de classe, por exemploObserve que normalmente as visualizações não são nomeadas de acordo com os tipos de modelo.