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
相关产品推荐
相关产品推荐

