如何在 Swift 中使用 Codable 时保持灵活的结构



我有一个 API 响应结构,表示一个用户对象,如下所示:

{
"statuscode": 200,
"response_type": 3,
"errormessage": null,
"detailresponse": {
"id": "2",
"shopifyautosync": null,
"platformfeepercentage": null,
"invited": null,
"requiresyoutubesocialmediaupdate": 1,
// Other properties ...
}

我正在使用JSONDecoder((.decode解码为以下结构:

import Foundation
class Response: Decodable {
var statuscode: Int?
var response_type: Int?
// Other properties
var detailresponse: User?
}
import Foundation
class User: Codable {
var id: String?
var street: String?
var supporturl: String?
var verifiedaccount: Int?
var showfeatureupdatemodal: Int?
var admin: Int?
var email: String?
// Other properties
}

以下是我如何解码:

let response = try JSONDecoder().decode(Response.self, from: jsonData)

我现在的主要问题是 Response 类的详细响应属性是硬连接到 User 结构的。但是,我的设置需要一点灵活性, 当然,当调用不同的端点(例如,协作对象而不是用户对象(时,DetailResponse将携带其他数据结构。

有没有一种优雅的方法可以使 Response 类中的详细响应保持灵活,而不是硬连线?还是通常更好的解决问题的方法?

你需要使用泛型

class Response<T:Decodable>: Decodable {
var statuscode: Int?
var response_type: Int?
// Other properties
var detailresponse: T?
}

然后

let response = try JSONDecoder().decode(Response<User>.self, from: jsonData)

这是泛型的一个用例:

class Response<T: Decodable>: Decodable {
var statuscode: Int?
var response_type: Int?
// Other properties
var detailresponse: T?
}

请注意,几乎没有理由使属性可变。他们应该let.此外,struct在这里可能是更好的选择。而且我认为应该有更少的选择,因为这应该是一个成功的回应。

相关内容

  • 没有找到相关文章

最新更新