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")
代码说明
- 移除错误循环:原代码中直接遍历单个
People对象的操作不符合语法要求,替换为递归函数printAllIds。 - 递归处理嵌套结构:
printAllIds先打印当前对象的id,再遍历其options数组,对每个子People对象递归调用自身,实现全层级id的打印。 - 仅打印根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
相关产品推荐
相关产品推荐

