JSONDecodable 和必需的 init

JSONDecodable and required init

我创建了一个网络管理器,它获取 JSON 响应并将其转换为 Swift 对象,

protocol HTTPResponse: Codable {
        
}

class UserResponse: HTTPResponse {
   var name: String?
}

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

其中 T 是 HTTPResponse 后代

我需要能够创建一个 'empty' UserResponse 对象,一个所有 class 变量都是 nil

的实例

我将 HTTPResponseprotocol 更改为 class 并添加了一个空的 required init() {}

这允许我调用 T() 并获取 UserResponse 的实例,但现在 JSONDecoder 不再解析 JSON,它还会创建所有变量的实例是 nil

如何实现 JSONDecoder 运行良好的最终结果,并且我可以创建我的 HTTPResponse 已故 classes 的存根实例?

我正在使用 swift 4.2

您可以将初始化要求添加到协议中:

protocol HTTPResponse: Codable {
    init()
}

然后,将required init() { ... }添加到UserResponse和所有conformers。每个符合者都可以决定“存根”响应对他们意味着什么。

之后 T() 将起作用,因为 T 是具有约束条件 <T: HTTPResponse> 的通用参数。当您正在初始化协议时,这可能看起来很奇怪。但实际上,由于 T 永远不会是 HTTPResponse,并且永远是符合 HTTPResponse.

的具体 class