首页 > 解决方案 > 使用 CodingKeys 访问结构变量的值

问题描述

我正在为我的结构创建一个自定义 JSON 解码方法,我需要遍历它的所有参数。我考虑过使用CodingKeys但我不知道如何实现它(或者即使它是可行的)。

这是我要减少的代码:

struct Root: Codable {

    let objectA: ObjectA?
    let objectB: ObjectB?

    enum CodingKeys: String, CodingKey {
        case objectA
        case objectB
    }

    init(from decoder: Decoder) throws {
        objectA = decodeOrSkip(using: decoder, key: .objectA)
        objectB = decodeOrSkip(using: decoder, key: .objectB)
        // ...
    }

    private func decodeOrSkip<T: Codable>(using decoder: Decoder, key: CodingKeys) -> T? {
        guard let container = try? decoder.container(keyedBy: CodingKeys.self) else { return nil }
        if let decoded = try? container.decode(T.self, forKey: key) {
            return decoded
        } else {
            log.warning("Unable to decode \(T.self) from \(String(describing: self))")
            return nil
        }
    }
}

struct ObjectA: Codable { /*...*/ }
struct ObjectB: Codable { /*...*/ }

如果我可以使用 CodingKeys 访问 struct 的变量的值,我可以遍历我的CodingKeys(通过使其符合CaseIterable)并应用decodeOrSkip它们中的每一个


在我的研究中,我发现了这篇文章:来自 String 的 Swift Keypath指出:

最后我发现我应该使用 CodingKeys 而不是 KeyPaths 来通过 String 访问结构的变量的值

但是没有显示如何实现它的代码。

标签: swiftjsondecoder

解决方案


推荐阅读