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

Swift解码JSON后for循环报错:需People遵循Sequence协议

解决Swift Playground中解码JSON后for循环报错问题

错误原因

你解码得到的jsonData是单个People实例,并非数组或序列类型,直接执行for jsondata in jsonData会触发For-in loop requires 'People.Type' to conform to 'Sequence'错误——for-in循环仅支持遍历遵循Sequence协议的类型(如数组、集合),单个对象不满足该条件。

修正方案

如果需要打印所有层级的id(包括嵌套在options里的子项),需通过递归遍历结构实现;若仅需打印根对象的id,直接输出即可。以下是完整修正代码:

修正后的代码

struct People: Codable {
    let id: String
    let options: [People]
}

// 递归打印所有层级的id
func printAllIds(_ people: People) {
    print("ID: \(people.id)")
    // 遍历当前对象的options,递归打印子项id
    for option in people.options {
        printAllIds(option)
    }
}

func loadJson(filename fileName: String) -> People? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(People.self, from: data)

            print("// Printing the ID of the Decode Json")
            // 调用递归函数打印所有id
            printAllIds(jsonData)
            
            return jsonData
        } catch {
            print("error:\(error)")
        }
    }
    return nil
}

loadJson(filename: "people1")

代码说明

  1. 移除错误循环:原代码中直接遍历单个People对象的操作不符合语法要求,替换为递归函数printAllIds。
  2. 递归处理嵌套结构:printAllIds先打印当前对象的id,再遍历其options数组,对每个子People对象递归调用自身,实现全层级id的打印。
  3. 仅打印根id的简化写法:若只需输出根对象的id,可直接写print("ID: \(jsonData.id)"),无需循环。

运行结果

执行后会按层级输出所有id:

// Printing the ID of the Decode Json
ID: 1
ID: 11
ID: 111
ID: 2
ID: 21
ID: 22
ID: 221

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:20:23