SwiftUI编译报错:无法在合理时间内完成表达式类型检查求助
编译错误排查求助
编译时遇到错误:The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions,错误始终出现在searchResults视图的body位置。我知道这类问题通常和代码优化有关,但找不到具体问题点。注释掉IndividualItemView里的@Bindable var review: Review能消除错误,但页面会没有内容显示。试过多种方法都没解决,希望有经验的开发者帮忙看看。
相关代码如下:
fineDine.swift
import SwiftUI import SwiftData @main struct fineDineApp: App { var body: some Scene { WindowGroup { searchResults(searchValue: "") .modelContainer(for: Review.self) } } }
searchresults.swift
import SwiftUI import SwiftData struct searchResults: View { @State private var isPresentingNewMealView = false @State var searchValue: String @Query var review: [Review] @Environment(\.modelContext) var modelContext var body: some View { <---错误出现位置 NavigationStack { ZStack { LinearGradient(gradient: Gradient(colors: [Color(red: 0.9725490196078431, green: 0.9607843137254902, blue: 0.8627450980392157, opacity: 1), Color(red: 0.9137254901960784, green: 0.9254901960784314, blue: 0.8509803921568627, opacity: 1), Color(red: 0.9882352941176471, green: 0.7529411764705882, blue: 0.13333333333333333, opacity: 1), Color(red: 0.9450980392156862, green: 0.47058823529411764, blue: 0.08627450980392157, opacity: 1)]), startPoint: .top, endPoint: .bottom).ignoresSafeArea() VStack{ Text("Which Food...") .font(.system(size: 30, weight: .bold, design: .default)) .padding() Image(systemName: "fork.knife.circle.fill") .font(.system(size: 100)) .foregroundStyle(.black) TextField("Enter Food or Restaurant", text: $searchValue) .frame(width: 300, height: 50, alignment: .center) .background(Color.white.opacity(0.4).cornerRadius(10)) .fontWeight(.medium) .foregroundColor(Color.black) .multilineTextAlignment(TextAlignment.center) Spacer() List { ForEach(review) { review in NavigationLink(destination: IndividualItemView()) { VStack(alignment: .leading) { Text(review.foodName) .font(.headline) } } }.listRowBackground(Color.white.opacity(0.4).cornerRadius(5)) } .scrollContentBackground(.hidden) .toolbar { Button(action: {isPresentingNewMealView = true} ) { Image(systemName: "plus") } .sheet(isPresented: $isPresentingNewMealView) { EditMealView(isPresentingNewMealView: $isPresentingNewMealView, mealImage: Image(""), review: Review(foodName: "", restaurantName: "", rating: 3, foodType: "", reviewNotes: "Enter Notes")) } } } } } } } #Preview { searchResults(searchValue: "") }
individualItemView.swift
import SwiftUI import SwiftData struct IndividualItemView: View { @Bindable var review: Review <----注释此行可解决错误但无内容显示 @Environment(\.modelContext) private var modelContext var body: some View { NavigationStack { ZStack { LinearGradient(gradient: Gradient(colors: [Color(red: 0.9725490196078431, green: 0.9607843137254902, blue: 0.8627450980392157, opacity: 1), Color(red: 0.9137254901960784, green: 0.9254901960784314, blue: 0.8509803921568627, opacity: 1), Color(red: 0.9882352941176471, green: 0.7529411764705882, blue: 0.13333333333333333, opacity: 1), Color(red: 0.9450980392156862, green: 0.47058823529411764, blue: 0.08627450980392157, opacity: 1)]), startPoint: .top, endPoint: .bottom).ignoresSafeArea() VStack { VStack(alignment: .leading) { Text(review.foodName) .font(.system(size: 30, weight: .bold, design: .default)) Text(review.restaurantName) Text(review.foodType) } VStack { Image("friedFood") .resizable() .frame(width: 300, height: 300) .cornerRadius(5) .padding() Label("\(review.rating)", systemImage: "star.fill") .foregroundStyle(Color.mint) .multilineTextAlignment(.center) .padding() Text(review.reviewNotes) .padding(.horizontal) } } } } } } #Preview { //IndividualItemView(review: Review(backingData: any )) IndividualItemView(review: Review(foodName: "", restaurantName: "", rating: 0, foodType: "", reviewNotes: "")) }
EditMealView.swift
import SwiftUI import PhotosUI import SwiftData struct EditMealView: View { @Binding var isPresentingNewMealView: Bool @Environment(\.modelContext) private var modelContext @State var mealImage: Image? @State var imageSelection: PhotosPickerItem? = nil @Bindable var review: Review let foodType: [String] = ["Select One...", "Fast Food", "Vegetarian", "Central African", "East African", "North African", "Southern Africa", "West African", "Latin American", "Native American", "Canadian", "Carribean", "Mexican", "American", "Southern American", "Fusion", "Central American", "South American", "Chinese", "Japanese", "Korean", "Indian", "Middle Eastern", "Thai", "Turkish", "Vietnamese", "Italian", "French", "German", "Spanish", "Greek", "Romanian", "Russian", "Eastern European", "Scandinavian", "British", "Dutch", "Swedish", "Norwegian", "Icelandic", "Irish", "Polynesian", "Australian", "New Zealand", "Other"] var body: some View { NavigationStack { ZStack { LinearGradient(gradient: Gradient(colors: [Color(red: 0.9725490196078431, green: 0.9607843137254902, blue: 0.8627450980392157, opacity: 1), Color(red: 0.9137254901960784, green: 0.9254901960784314, blue: 0.8509803921568627, opacity: 1), Color(red: 0.9882352941176471, green: 0.7529411764705882, blue: 0.13333333333333333, opacity: 1), Color(red: 0.9450980392156862, green: 0.47058823529411764, blue: 0.08627450980392157, opacity: 1)]), startPoint: .top, endPoint: .bottom).ignoresSafeArea() .navigationTitle("Add Meal") VStack{ Form { TextField("Food Name", text: $review.foodName) .listRowBackground(Color.clear) TextField("Restaurant", text: $review.restaurantName) .listRowBackground(Color.clear) Picker(selection: $review.foodType, label: Text("Select Style")) { ForEach(0..<foodType.count, id: \.self) { Text(foodType[$0]) } } .listRowBackground(Color.clear) VStack{ Text("Current \(Image(systemName: "star.fill")) Rating: \((review.rating), format: .number.rounded(increment: 0.1))") Slider(value: $review.rating, in: 1...5, step: 0.5) } .listRowBackground(Color.clear) .padding() VStack{ HStack { mealImage? .resizable() .frame(width: 300, height: 300) } HStack { Spacer() PhotosPicker( selection: $imageSelection) { Image(systemName: "photo.circle.fill").imageScale(.large) } .task(id: imageSelection) { mealImage = try? await imageSelection?.loadTransferable(type: Image.self) } Spacer() }.padding() } .listRowBackground(Color.clear) .padding() TextEditor(text: $review.reviewNotes) .listRowBackground(Color.clear) } } .scrollContentBackground(.hidden) .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Dismiss") { isPresentingNewMealView = false } } ToolbarItem(placement: .confirmationAction) { Button("Add") { let newReview = review modelContext.insert(newReview) isPresentingNewMealView = false } } } } } } } #Preview { do { let config = ModelConfiguration(isStoredInMemoryOnly: true) let container = try ModelContainer(for: Review.self, configurations: config) let example = Review(foodName: "Cheetos", restaurantName: "House", rating: 3, foodType: "American", reviewNotes: "Delicious") return EditMealView(isPresentingNewMealView: .constant(true), mealImage: Image(""), review: example) .modelContainer(container) } catch { fatalError("Failed to create model container.") } }
内容的提问来源于stack exchange,提问作者user29801994
相关产品推荐
相关产品推荐

