SwiftUI #Preview宏调用匹配失败及控制流报错求助
问题分析
你遇到的核心冲突来自SwiftUI Preview的两个Result Builder规则:
PreviewMacroBodyBuilder规则:当#Preview闭包中包含控制流语句(如for循环)时,必须通过显式return返回预览视图ViewBuilder规则:视图构建上下文不允许使用显式return语句
而你第二个代码能运行的原因是:直接创建的Collection实例未触发Core Data上下文的视图构建检查,编译器默认接受了显式return,但这种方式传入的对象不在Core Data容器上下文中,不符合最佳实践。
解决方案
将所有Core Data准备逻辑(创建容器、插入测试数据、获取目标对象)封装到立即执行闭包中,隔离控制流语句,让#Preview主闭包仅隐式返回视图,同时满足两个Builder的规则:
#Preview { // 立即执行闭包处理所有Core Data准备工作 let (container, selectedCollection): (ModelContainer, Collection) = { let config = ModelConfiguration(isStoredInMemoryOnly: true) let container = try! ModelContainer(for: Collection.self, configurations: config) // 插入测试集合数据 for number in 1...10 { let col = Collection(name: "Test Collection \(number)") container.mainContext.insert(col) } // 安全获取第一个集合对象 let fetchResult = container.mainContext.fetch(Collection.self) guard let selectedCollection = fetchResult.first else { fatalError("Failed to fetch test collection") } return (container, selectedCollection) }() // 隐式返回预览视图,符合所有规则 ItemCreateView(selectedCollection: selectedCollection) .modelContainer(container) }
关键说明
- 立即执行闭包
{ ... }()将控制流逻辑隔离在Preview主闭包之外,避免触发PreviewMacroBodyBuilder的显式return要求 - 从Core Data上下文获取的
selectedCollection与ItemCreateView中@Query获取的集合处于同一上下文,符合Core Data使用规范 - 用
guard替代强制解包,避免预览时因数据问题崩溃
内容的提问来源于stack exchange,提问作者Dovizu
相关产品推荐
相关产品推荐

