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

如何在SwiftUI预览中预设字典以正常显示LazyVGrid?

解决方法

当然可以在Preview中初始化字典,只需要调整代码结构让视图的数据源支持外部传入,就能独立在预览中提供测试数据,无需依赖应用初始化流程。

步骤1:重构视图,将字典作为参数传入

把全局的choices变量改为PickANumber视图的属性,通过初始化方法传入,这样数据源就可以灵活替换:

struct PickANumber: View {
    let choices: [String: [Int]]
    let columns: [GridItem]
    
    // 初始化方法,支持传入自定义字典和列配置
    init(choices: [String: [Int]], columns: [GridItem]) {
        self.choices = choices
        self.columns = columns
    }
    
    // 也可以提供默认参数,方便正常使用
    init() {
        self.choices = ["firstRound": [1,2,3,4,5,6,7,8,9,10]]
        self.columns = Array(repeating: GridItem(.flexible()), count: 3)
    }
    
    var body: some View {
        VStack {
            LazyVGrid(columns: columns) {
                // 用可选绑定替代强制解包,避免崩溃风险
                if let firstRoundNumbers = choices["firstRound"] {
                    ForEach(firstRoundNumbers, id: \.self) { number in
                        Text("\(number)")
                            .padding(.top, 10)
                    }
                }
            }
        }
    }
}

步骤2:在Preview中传入测试数据

现在可以直接在Preview里初始化测试用的字典,实时预览网格效果:

#Preview {
    PickANumber(
        choices: ["firstRound": [1,2,3,4,5,6,7,8,9,10]],
        columns: Array(repeating: GridItem(.flexible()), count: 4) // 可直接调整列数测试
    )
}

额外优化点

原代码中的choices["firstRound"]!强制解包存在崩溃风险,改用if let可选绑定可以让代码更健壮,即使字典中没有firstRound键,视图也能正常显示(不会崩溃)。

调整后,你可以直接在Preview里修改字典内容、网格列数或样式,实时查看效果,无需启动调试器等待应用初始化。

内容的提问来源于stack exchange,提问作者Bartender1382

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:23