используйте 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 для доступа к значению a переменной структуры, я мог бы перебрать свой CodingKeys (приведя его в соответствие с CaseIterable) и применить decodeOrSkip для каждого из них


Во время своих исследований я нашел этот пост: Swift Keypath from String, в котором говорится:

Наконец я узнал, что я должен использовать CodingKeys вместо KeyPaths для доступа к значению переменной структуры с помощью String

Но не показано кода, как этого достичь.


person Olympiloutre    schedule 25.07.2019    source источник
comment
Почему ты не можешь просто сделать objectA = try? container.decode(ObjectA.self, forKey: .objectA)?   -  person Steven0351    schedule 25.07.2019
comment
Я мог полностью! но проблема остается той же, как я могу перебрать все мои objectX с помощью CodingKeys ?   -  person Olympiloutre    schedule 25.07.2019
comment
Вы не можете получить доступ к переменным-членам структуры Swift через строки. Возможно, вы могли бы сделать что-то подобное с Mirror API в стандартной библиотеке: developer.apple.com/documentation /swift/mirror, но вы не будете использовать строки для доступа к чему-либо.   -  person Steven0351    schedule 25.07.2019