Я создаю собственный метод декодирования 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
Но не показано кода, как этого достичь.
objectA = try? container.decode(ObjectA.self, forKey: .objectA)
? - person Steven0351   schedule 25.07.2019objectX
с помощьюCodingKeys
? - person Olympiloutre   schedule 25.07.2019