如何将字典转数组填充table view并解决Swift解码keyNotFound报错
问题原因
- 核心报错触发原因:你定义的
MessageResponse结构体声明要解码messages字段,但接口返回的JSON根节点存储消息数组的字段名是data,解码器找不到对应messages键就抛出了keyNotFound错误。 - 额外冗余问题:
Message结构体中你额外定义了messages: [String]属性,还在自定义解码初始化方法里写了无意义的遍历逻辑,完全不需要用到,属于无效代码还容易引发运行异常。
修正后的完整代码
// 匹配接口JSON根结构的响应体 struct MessageResponse: Codable { // 对应JSON根节点的data字段 let data: [Message] } struct Message: Codable { var userID: String var username: String var avatarURL: String var text: String enum CodingKeys: String, CodingKey { case userID = "user_id" case username = "name" case avatarURL = "avatar_url" case text = "message" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) userID = try values.decodeIfPresent(String.self, forKey: .userID) ?? "" username = try values.decodeIfPresent(String.self, forKey: .username) ?? "" avatarURL = try values.decodeIfPresent(String.self, forKey: .avatarURL) ?? "" text = try values.decodeIfPresent(String.self, forKey: .text) ?? "" } } // 接口请求方法修正 func getChat(){ ChatClient.shared.getMessages { messageResponse in // 直接取响应体的data字段为消息数组 self.messages = messageResponse.data print(self.messages) } }
可选优化
如果你的网络请求层已经提前把根节点的data字段数据取出再做解码,可以直接删除MessageResponse结构体,直接解码[Message].self即可,不需要额外套响应体层。
内容的提问来源于stack exchange,提问作者Tom Hiddleston
相关产品推荐
相关产品推荐

