Swift Codable:如何复用解码逻辑处理不同类型数组响应
用泛型封装通用响应结构,彻底消除解码冗余
这简直是API解码里的典型场景,泛型就是解决这类重复问题的最优解!你只需要定义一个通用的响应结构体,把所有接口共有的字段(比如状态码、提示消息)放进去,用泛型来指代items数组的元素类型,就能一次搞定所有接口的解码逻辑。
第一步:定义泛型响应结构体
首先创建一个遵循Decodable的泛型结构体,把所有接口都有的通用字段抽离出来,用<T: Decodable>约束泛型类型必须支持解码:
struct APIResponse<T: Decodable>: Decodable { // 假设这些是所有响应都有的通用字段 let code: Int let message: String // 用泛型T指代items的元素类型 let items: [T] }
如果你的接口里items可能为nil,可以把它改成可选类型:let items: [T]?,适配更灵活的场景。
第二步:为具体类型实现Decodable
只需要确保你的Item和User各自遵循Decodable(如果结构简单,Swift会自动生成合成实现):
struct Item: Decodable { let id: String let name: String // 其他Item专属字段... } struct User: Decodable { let userId: Int let username: String // 其他User专属字段... }
第三步:解码不同类型的响应
现在不管是解码[Item]还是[User],只需要在调用JSONDecoder时指定泛型参数即可,完全不需要重复写响应结构:
// 解码Item列表 do { let itemResponse = try JSONDecoder().decode(APIResponse<Item>.self, from: itemJsonData) let items = itemResponse.items // 处理Item数据... } catch { print("Item解码失败:\(error)") } // 解码User列表 do { let userResponse = try JSONDecoder().decode(APIResponse<User>.self, from: userJsonData) let users = userResponse.items // 处理User数据... } catch { print("User解码失败:\(error)") }
额外优势
这种方式不仅消除了代码冗余,还让代码的可维护性大大提升:如果后期服务器修改了通用响应的字段(比如把code改成statusCode),你只需要修改APIResponse这一处,所有接口的解码逻辑都会自动适配,不用逐个去改。
内容的提问来源于stack exchange,提问作者Sebastian Limbach
相关产品推荐
相关产品推荐

