Ios 使用Codable或ObjectMapper映射通用API响应

Ios 使用Codable或ObjectMapper映射通用API响应,ios,swift,mapping,codable,objectmapper,Ios,Swift,Mapping,Codable,Objectmapper,我面临着一个挑战,就是如何使用codable或objectmapper将通用api响应映射到模型类。假设我有这些针对不同api的api响应 { "code" : 0, "http_response" : 200, "success" : true, "data" : user } { "code" : 0, "http_response" : 200, "success" : true, "data" : locations } { "code"

我面临着一个挑战,就是如何使用codable或objectmapper将通用api响应映射到模型类。假设我有这些针对不同api的api响应

{
  "code" : 0, 
  "http_response" : 200,
  "success" : true, 
  "data" : user
}

{
  "code" : 0, 
  "http_response" : 200,
  "success" : true, 
  "data" : locations
}

{
  "code" : 0, 
  "http_response" : 200,
  "success" : true, 
  "data" : countries
}
在这里,用户、地点和国家是单独的可编码/映射类

我必须构造一个这样的类

struct APIResponse : Codable {
    let success : Bool?
    let http_response : Int?
    let code : Int?
    let data : ??
}
我将如何构造我的基类来使用一个类处理这些响应,或者我将构造不同的类来根据值更改“数据”类型

任何形式的帮助或建议都将不胜感激


感谢

为您的结构创建泛型约束,该约束表示
T
必须符合
可解码
,然后使用此类型指定
数据的类型

struct APIResponse<T: Decodable>: Decodable {
    var code, httpResponse: Int
    var success: Bool
    var data: T
}

struct User: Decodable {
    var name: String
}
对象数组

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

do {
    let responses = try decoder.decode([APIResponse<[User]>].self, from: data)
    let users = responses[0].data /* data of type `[User]` of specific response */
} catch { print(error) }
let decoder=JSONDecoder()
decoder.keyDecodingStrategy=.convertFromSnakeCase
做{
let responses=try decoder.decode([APIResponse].self,from:data)
让用户=响应[0]。特定响应的“[User]”类型的数据/*数据*/
}捕获{打印(错误)}

考虑到
用户
国家
位置
是可解码的,您的解码方法和
APIResponse
将如下所示

struct APIResponse<T: Decodable>: Decodable {
    var data: T?
    var code: Int
    var success: Bool
    var http_response: Int
}

func decode<T: Decodable>(data: Data, ofType: T.Type) -> T? {
    do {
        let decoder = JSONDecoder()
        let res = try decoder.decode(APIResponse<T>.self, from: data)
        return res.data
    } catch let parsingError {
        print("Error", parsingError)
    }
    return nil
}
struct APIResponse<T: Decodable>: Decodable {
    var data: T?
    var code: Int
    var success: Bool
    var http_response: Int
}

func decode<T: Decodable>(data: Data, ofType: T.Type) -> T? {
    do {
        let decoder = JSONDecoder()
        let res = try decoder.decode(APIResponse<T>.self, from: data)
        return res.data
    } catch let parsingError {
        print("Error", parsingError)
    }
    return nil
}
let data = Data() // From the network api 

//User
let user = decode(data, ofType: User.self)

// Countries
let countries = decode(data, ofType: [Country].self) 

// Locations
let locations = decode(data, ofType: [Location].self)