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

Swift批量解码JSON文件并合并数组的代码优化咨询

问题解答

现有代码的正确性

你的代码逻辑是可以实现需求的:遍历21个JSON文件,逐个解码后将每个文件中的detailSections数组元素合并到全局数组中。但代码存在不少安全隐患和可优化点:

  • 使用try!和强制解包!:若某个JSON文件缺失、路径错误或格式不符合结构体定义,程序会直接崩溃,生产环境中这种写法风险极高。
  • 内层循环冗余:通过for sections in 0...a逐个append元素完全没必要,可直接用数组方法一次性添加整个数组。
  • 频繁打印全数组:随着元素增多,这种打印会越来越耗时,且调试价值极低。

更优实现方案

以下是优化后的代码,解决了上述问题,同时保持逻辑清晰:

struct SearchDetailSections: Decodable {
    var detailSections: [SearchDetailSection]
}

struct SearchDetailSection: Decodable {
    // 注:你的JSON包含"index"字段,若需要使用可添加该属性
    // let index: Int
    let title, translation, transcription: String
}

class SearchViewController: UIViewController {
    var searchDetailSections = [SearchDetailSection]()

    func decodeSections() {
        for index in 1...21 {
            // 安全获取文件URL,避免强制解包崩溃
            guard let url = Bundle.main.url(forResource: "\(index)", withExtension: "json") else {
                print("无法找到文件:\(index).json")
                continue
            }
            
            do {
                let data = try Data(contentsOf: url)
                let result = try JSONDecoder().decode(SearchDetailSections.self, from: data)
                // 一次性添加整个数组,替代冗余内层循环
                searchDetailSections.append(contentsOf: result.detailSections)
            } catch {
                // 捕获错误并输出,方便调试定位问题
                print("处理文件\(index).json出错:\(error.localizedDescription)")
            }
        }
        // 所有文件处理完成后再打印最终结果
        print(searchDetailSections)
    }
}

优化点说明

  • 安全处理可选值:用guard let判断文件URL是否存在,避免强制解包导致的崩溃。
  • 错误捕获机制:通过do-catch捕获数据读取和解码时的错误,程序不会直接崩溃,还能输出错误信息便于调试。
  • 简化数组合并:用append(contentsOf:)直接添加整个数组,省去冗余循环,代码更简洁高效。
  • 调整打印时机:仅在所有文件处理完成后打印最终数组,减少不必要的性能消耗。

额外建议

如果JSON中的index字段是业务需要的,可以在SearchDetailSection结构体中添加let index: Int属性,即可解码并使用该字段的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:59:58