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

如何将字典转数组填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:30:04