Как использовать метод init в Codable, когда у вас есть модель внутри? - PullRequest
0 голосов
/ 28 мая 2018

Новое в мире кода и заранее спасибо,

Я получаю ошибку

Невозможно присвоить значение типа 'String?'набрать 'ModalA.ModalC?'

Вот мой класс модели,

struct ModalA: Codable {
    struct ModalB: Codable {
        let value2: String?
        let value3: ModalC?
        private enum CodingKeys: String, CodingKey {
            case value3 = "Any"
            case value2 = "Anything"
        }
        init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            value2 = try values.decodeIfPresent(String.self, forKey: .value2)
            value3 = try values.decodeIfPresent(String.self, forKey: .value3) // getting error on this line
        }
    }
    struct ModalC: Codable {
        let value3: String?
    }
    let value1: ModalB?
}

Как решить эту ошибку?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы можете исправить это с помощью

value3 = try values.decodeIfPresent(ModalC.self, forKey: .value3)

, но объявление значения 3 как необязательного

let value3: ModalC?

извлечет его, если оно изначально существует в разобранном json, поэтому ? достаточно

0 голосов
/ 26 августа 2018

Вы должны использовать

init(){

}


init(from decoder: Decoder) throws{

}

Вы можете прочитать мой пост здесь для более подробной информации.

0 голосов
/ 28 мая 2018

Ваше свойство value3 имеет тип ModalC, но при декодировании вы пытаетесь проанализировать значение String (при передаче String.self в decodeIfPresent метод).

decodeIfPresent методпринимает тип декодируемого значения в качестве первого аргумента.В вашем случае метод decodeIfPresent возвращает значение String, и вы пытаетесь установить значение String для свойства типа ModalC.

Таким образом, чтобы устранить ошибку, вы должны сказать, что хотите получить значениетипа ModalC для ключа .value3.Для этого вы должны передать ModalC.self примерно так:

value3 = try values.decodeIfPresent(ModalC.self, forKey: .value3)
...