Swift如何不使用Codable创建API响应对象类型及Decodable报错解决
不使用Codable的实现方案
你之前运行报错是因为[String: AnyObject]属于Swift字典类型,不支持类似TypeScript对象的点语法直接访问键值,必须通过下标逐层取值并做类型校验,示例代码如下:
do { guard let createMeetingResponse = try JSONSerialization.jsonObject(with: createMeetingData, options: []) as? [String: Any], let data = createMeetingResponse["data"] as? [String: Any], let id = data["id"] as? String, let name = data["name"] as? String, let email = data["email"] as? String else { return } // 取值成功后直接使用对应变量即可 print(id) } catch { print("JSON解析失败:\(error)") }
这种方案不需要定义响应结构体,但是嵌套层级深的时候需要写大量类型判断代码,维护成本很高,更推荐使用Codable方案。
Decodable报错修复方案
你遇到的Type 'CreateMeetingResponse' does not conform to protocol 'Decodable'报错,原因是嵌套的MeetingResponse结构体没有遵守Decodable协议,编译器无法自动完成解析逻辑,修改后的结构体代码如下:
struct MeetingResponse: Decodable { let id: String let name: String let email: String } struct CreateMeetingResponse: Decodable { let data: MeetingResponse }
对应的解析代码示例:
do { let response = try JSONDecoder().decode(CreateMeetingResponse.self, from: createMeetingData) // 可以直接用点语法取值,和TypeScript的使用习惯一致 print(response.data.id) print(response.data.name) print(response.data.email) } catch { // 解析失败时可直接打印错误查看具体原因 print("响应解析失败:\(error)") }
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

