You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:08:06