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
相关产品推荐
相关产品推荐

