JSONDecodable и обязательный init - PullRequest
       81

JSONDecodable и обязательный init

0 голосов
/ 02 августа 2020

Я создал сетевой менеджер, который получает ответ JSON и преобразует его в объект Swift,

protocol HTTPResponse: Codable {
        
}

class UserResponse: HTTPResponse {
   var name: String?
}

let responseObj = try? JSONDecoder().decode(T.self, from: response.data!)

, где T является наследником HTTPResponse

I необходимо иметь возможность создать «пустой» объект UserResponse, экземпляр, в котором все переменные класса: nil

Я изменил HTTPResponse с protocol на class и добавил пустой required init() {} к нему.

Это позволяет мне вызвать T() и получить экземпляр UserResponse, но теперь JSONDecoder больше не анализирует JSON, он также создает экземпляры, где все переменные nil

Как я могу достичь конечного результата, при котором JSONDecoder работает хорошо, и я могу создавать экземпляры-заглушки моих HTTPResponse дочерних классов?

Я работаю с swift 4.2

1 Ответ

1 голос
/ 02 августа 2020

Вы можете добавить к протоколу требование инициализатора:

protocol HTTPResponse: Codable {
    init()
}

Затем добавьте required init() { ... } к UserResponse и всем конформерам. Каждый конформер может решить, что для него означает «заглушка».

После этого T() будет работать, учитывая, что T - это общий c параметр с ограничением <T: HTTPResponse>. Это может показаться странным, если вы инициализируете протокол. Но на самом деле, поскольку протоколы сами себе не соответствуют , T никогда не будет HTTPResponse и всегда будет конкретным классом, который соответствует HTTPResponse.

...