Я пытаюсь декодировать очень простой json с помощью JSONDecoder от Swift, используя KeyDecodingStrategy.convertFromSnakeCase
. Я получаю следующую ошибку, и я не понимаю, почему:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
Это вывод консоли, который я получаю:
Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "latestBuildVersion", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"latestBuildVersion\", intValue: nil) (\"latestBuildVersion\"), converted to latest_build_version.", underlyingError: nil)): file MyPlayground.playground, line 14
Когда я не использую keyDecodingStrategy и выдаю enum с ключами кодирования, все отлично работает. Вот код игровой площадки, который вызывает ошибку:
import UIKit
struct App: Codable {
var stacks: Set<Stack>
}
struct Stack : Codable, Hashable {
var latestBuildVersion: Int
init(from decoder: Decoder) throws {
let container = try! decoder.container(keyedBy: Stack.CodingKeys.self)
latestBuildVersion = try! container.decode(Int.self, forKey: .latestBuildVersion)
}
}
let jsonData = """
{
"stacks":
[
{
"latest_build_version": 436346213
}
]
}
""".data(using: .utf8)!
let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
let stack = try! jsonDecoder.decode(Stack.self, from: jsonData)
print(stack.latestBuildVersion)