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

Swift开发中何时使用Decodable、Codable、Encodable收发接口数据

Swift 编解码协议适用场景说明

Swift 中三个编解码协议的边界非常清晰,直接根据你的业务需求选择即可:

  • Encodable:用于序列化场景,也就是把 Swift 模型转成 JSON、plist 等格式的数据。如果你需要把本地构造的模型提交给后端接口、或者把模型写入本地文件做持久化,只需要给模型声明遵守Encodable协议即可。
  • Decodable:用于反序列化场景,也就是把后端返回的 JSON 数据、本地读取的序列化数据转成 Swift 模型。你当前的需求是拉取 API 数据解析成模型,代码里泛型约束T: Decodable是完全正确的,不需要做修改。
  • Codable:是 Swift 内置的别名协议,等价于Encodable & Decodable,同时支持序列化和反序列化能力。只有当你的模型同时需要做序列化和反序列化操作时,比如既要从接口拉取用户信息解析为模型,又要修改用户信息后序列化为参数提交给后端,才需要让模型遵守Codable协议。

代码优化建议

你当前的代码没有逻辑问题,不过泛型约束不需要升级为Codable,额外的Encodable约束属于多余限制,会导致仅遵守Decodable的模型无法使用这个请求方法。
你也可以把解码逻辑内置到方法中,简化外部调用成本,参考修改:

import Foundation
import UIKit
 
//return error if API error
enum ServiceError: Error {
    case decofailure
    case decocorrupt 
}

class WebServiceRequest {
    func loadData<T: Decodable>(url: URL, decoder: JSONDecoder = JSONDecoder()) async throws -> T {
        let (data, response) = try await URLSession.shared.data(from: url)
         
        guard (response as? HTTPURLResponse)?.statusCode == 200 else {
            throw ServiceError.decofailure
        }
     
        do {
            return try decoder.decode(T.self, from: data)
        } catch {
            throw ServiceError.decocorrupt
        }
    }  
}

内容的提问来源于stack exchange,提问作者Wen Love Howard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:45:03