SwiftUI 数组套字典如何遍历展示[2025-12-01]

在开发中经常遇到,一个数组包含以字典为子元素的情况。我在SwiftUI中,如何对数组数据进行访问并展示在界面上,遇到了不能访问的问题, 下面是对该问题的解决以及记录。方便日后快速解决类似问题。

import SwiftUI
import CoreBluetooth

// 模拟 CBCharacteristic(仅用于示例)
class MockCharacteristic: CBCharacteristic {
    init(uuid: CBUUID) {
        super.init()
    }
}

struct CharView: View {
    // 模拟测试数据
    let charData: [[String: [CBCharacteristic]]] = [
        ["FFE0": [MockCharacteristic(uuid: CBUUID(string: "FFE1"))]],
        ["FFF0": [MockCharacteristic(uuid: CBUUID(string: "FFF1")), MockCharacteristic(uuid: CBUUID(string: "FFF2"))]],
        [:] // 空字典
    ]
    
    var body: some View {
        VStack(spacing: 15) {
            Text("蓝牙特征数据列表")
                .font(.title)
            
            charDataContentView
        }
        .padding()
    }
    
    @ViewBuilder 
    private var charDataContentView: some View { // 重点、亮点
        if charData.isEmpty {
            Text("暂无数据")
                .foregroundColor(.gray)
        } else {
            ForEach(charData.indices, id: \.self) { index in // 重点、亮点
                let dict = charData[index]
                VStack(alignment: .leading, spacing: 5) {
                    Text("第 \(index+1) 组")
                        .font(.subheadline)
                        .bold()
                    
                    if dict.isEmpty {
                        Text("→ 空服务")
                            .foregroundColor(.gray)
                    } else {
                        ForEach(Array(dict), id: \.key) { key, chars in
                            Text("→ 服务 \(key):\(chars.count) 个特征") // 重点、亮点
                        }
                    }
                }
                .padding(.vertical, 5)
                .padding(.horizontal, 10)
                .background(Color(.systemGray6))
                .cornerRadius(8)
            }
        }
    }
}

// 预览
struct CharView_Previews: PreviewProvider {
    static var previews: some View {
        CharView()
    }
}

总结

ViewBuilder 核心规则.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容