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
的实例
我将 HTTPResponse
从 protocol
更改为 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
我创建了一个网络管理器,它获取 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
我将 HTTPResponse
从 protocol
更改为 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
.