Ошибка EXC_BAD_INSTRUCTION при использовании JSONDecoder - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь декодировать очень простой 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)
...