Xcode 15.0.1使用#Preview出现init(_:traits:body:)歧义使用错误
解决SwiftUI预览「Ambiguous use of 'init(_:traits:body:)'」错误
针对你遇到的新旧预览语法均报错、但模拟器可正常运行的问题,可尝试以下针对性解决步骤:
清理Xcode缓存与派生数据
这是预览服务缓存冲突的常见解决方式:- 按下
Cmd+Shift+K清理Build Folder; - 打开Xcode偏好设置(
Cmd+,)→ 选择「Locations」→ 点击Derived Data路径旁的箭头,删除对应项目的派生数据文件夹; - 关闭并重新打开Xcode后重试预览。
- 按下
明确预览闭包的返回类型
强制指定返回类型可避免Swift类型推断的歧义,修改后的代码如下:
新语法:#Preview { let viewModel = RecordingDetailViewModel(recording: nil, viewContext: PersistenceController.preview.container.viewContext) return TranscribingTransitionView(viewModel: viewModel) as View }旧语法:
struct TranscribingTransitionView_Previews: PreviewProvider { static var previews: some View { let viewModel = RecordingDetailViewModel(recording: nil, viewContext: PersistenceController.preview.container.viewContext) return TranscribingTransitionView(viewModel: viewModel) as View } }明确ViewModel初始化的参数类型
若RecordingDetailViewModel存在重载的init方法,可能导致nil的类型推断模糊,可显式指定参数类型:let viewModel = RecordingDetailViewModel(recording: Recording?.none, viewContext: PersistenceController.preview.container.viewContext)重启预览服务与Xcode
预览进程异常卡死时:- 点击预览面板的「重启」按钮;
- 若无效,强制退出Xcode(
Cmd+Q),并在Activity Monitor中结束所有「Xcode Preview」进程,再重新打开项目。
升级Xcode到最新稳定版
早期版本的#Preview宏存在语法解析bug,升级到最新版Xcode(如15.x系列)可修复多数预览兼容性问题。
内容的提问来源于stack exchange,提问作者Ollie Khakwani
相关产品推荐
相关产品推荐

