Xcode 15中如何在#Preview宏内使用let常量?
解决Xcode 15中#Preview宏使用let变量时的歧义错误问题
你遇到的问题源于#Preview宏与旧版PreviewProvider的闭包语法解析规则差异:
- 旧版PreviewProvider的
previews属性闭包属于多语句代码块,Swift会自动将最后一行表达式作为返回值,因此先声明变量再写View的写法能正常工作。 - 但#Preview宏的闭包默认期望直接返回View实例,当你在闭包里先声明
let变量再写View时,Swift会将闭包解析为多语句代码块,此时最后一行的CategoryView初始化结果未被显式返回,导致宏无法正确匹配对应的初始化方法,进而触发「Ambiguous use of 'init(_:traits:body:)'」的歧义错误,同时出现「Result of 'CategoryView' initializer is unused」的警告。
解决办法
方法1:显式返回View实例
在闭包中添加return关键字,明确指定要返回的View:
#Preview { let categories = Bundle.main.decode([Category].self, from: "Items.json") return CategoryView(category: categories[0]) }
方法2:用立即执行闭包包裹逻辑
将变量声明和View初始化放在立即执行闭包内,让整个表达式直接返回View:
#Preview { ({ let categories = Bundle.main.decode([Category].self, from: "Items.json") return CategoryView(category: categories[0]) })() }
两种方法都能让#Preview宏正确识别要展示的View,解决歧义错误与警告问题。
内容的提问来源于stack exchange,提问作者Sébastien REMY
相关产品推荐
相关产品推荐

