如何为Codable结构体添加非Decodable属性?Swift错误修复
修复方案
你遇到的编译错误核心有两个层面的问题:一是新增的nodesWithDepth属性不满足Codable要求,二是错误信息指向的GROUP类型不匹配问题,下面分别给出修复方法:
方法一:最简单的快速修复(推荐)
给非Codable的nodesWithDepth属性设置默认值,让Swift编译器自动合成Codable的实现逻辑,无需手动编写解码/编码方法:
public struct NEWTREE: Equatable, Codable { public var Filename: String public var GROUP: [GROUP] public var ITEM: [ITEM] public var CATEGORY: [CATEGORY] public var ROOT: ROOT // 给非Codable属性添加默认值,编译器会自动忽略它的编解码流程 public var nodesWithDepth: [(text: String, depth: Int, type: TreeData2)]? = nil }
这种方式下,原结构体的Codable能力完全保留,nodesWithDepth不会参与JSON的编解码,也不会触发编译错误。
方法二:自定义编解码逻辑(如果需要在解码后初始化nodesWithDepth)
如果需要在解码完成后手动初始化nodesWithDepth,必须同时实现Decodable的init(from:)和Encodable的encode(to:)方法(因为Codable是这两个协议的组合),同时检查GROUP的解码代码是否写错:
public struct NEWTREE: Equatable, Codable { public var Filename: String public var GROUP: [GROUP] public var ITEM: [ITEM] public var CATEGORY: [CATEGORY] public var ROOT: ROOT public var nodesWithDepth: [(text: String, depth: Int, type: TreeData2)]? public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) Filename = try container.decode(String.self, forKey: .Filename) // 检查这里的类型是否为[GROUP].self,不要写成[[GROUP]].self(二维数组) GROUP = try container.decode([GROUP].self, forKey: .GROUP) ITEM = try container.decode([ITEM].self, forKey: .ITEM) CATEGORY = try container.decode([CATEGORY].self, forKey: .CATEGORY) ROOT = try container.decode(ROOT.self, forKey: .ROOT) // 在这里添加nodesWithDepth的初始化逻辑 // nodesWithDepth = 你的初始化代码 } // 必须实现编码方法,否则不满足Codable协议要求 public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(Filename, forKey: .Filename) try container.encode(GROUP, forKey: .GROUP) try container.encode(ITEM, forKey: .ITEM) try container.encode(CATEGORY, forKey: .CATEGORY) try container.encode(ROOT, forKey: .ROOT) // nodesWithDepth不需要编码,直接忽略 } private enum CodingKeys: String, CodingKey { case Filename, GROUP, ITEM, CATEGORY, ROOT } }
关于错误信息的说明
你看到的Cannot convert value of type '[[GROUP]]' to expected argument type '[GROUP].Type'错误,大概率是在解码GROUP时,误将类型写成了[[GROUP]].self(二维数组),而你的GROUP属性是一维数组[GROUP],检查代码中的decode调用即可解决。
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

