You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI #Preview宏调用匹配失败及控制流报错求助

问题分析

你遇到的核心冲突来自SwiftUI Preview的两个Result Builder规则:

  1. PreviewMacroBodyBuilder规则:当#Preview闭包中包含控制流语句(如for循环)时,必须通过显式return返回预览视图
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:49:51