Почему метод init в Decodable не вызывается при использовании метода JSONDecoder.decode? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь переопределить, как JSONDecoder декодирует данные.

Я попробовал следующее:

struct Response : Decodable {
    init(from decoder: Decoder) throws {
        print("Hello")
    }
}

let result = try JSONDecoder().decode(Response.self, from: Data())

Но init(from:) не вызывается. По сути, я хочу, чтобы JSONDecoder всегда имел успех при декодировании пустых данных в пустой Response объект

1 Ответ

1 голос
/ 11 июня 2019

Пустой объект Data заставляет метод init выдавать ошибку

Указанные данные не были действительными в формате JSON.

до того, как напечатано "Hello".


Если вы хотите получить пустой Response объект (при условии, что вам не нужно вызывать какой-либо назначенный инициализатор), перехватите dataCorrupted ошибку декодирования

struct Response : Decodable {}

var response : Response?
do {
    response = try JSONDecoder().decode(Response.self, from: Data())
} catch DecodingError.dataCorrupted(let context) where (context.underlyingError as NSError?)?.code == 3840 { // "The given data was not valid JSON."
    response = Response()
} catch { print(error) }
...