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

无法将服务器返回数据解码为Swift的UserResult数据模型,错误出在哪里?

问题根因

  • as? [UserResult] 类型转换不成立:Socket.IO返回的data中存储的是NSDictionary类型的原始数据,和你定义的UserResultSwift结构体没有继承/兼容关系,无法直接通过类型强转转换。
  • 返回数据结构嵌套:你打印的返回内容最外层是一个数组,真正的用户列表存储在该数组的第一个元素中,你没有先解外层的嵌套结构。

修复代码

func userSearch(keyword: String, completion: @escaping (Result<[UserResult], ResponseError>) -> Void ) {
    socket.emit("userSearch", keyword)
    
    socket.on("userFound") { (data, ack) in
        // 先解外层数组,取出第一个元素也就是真正的用户字典数组
        guard let userDicts = data.first as? [[String: Any]], !userDicts.isEmpty else {
            completion(.failure(.badRequest("No users found")))
            return
        }
        do {
            // 把字典数组转成Data再用JSONDecoder解码
            let jsonData = try JSONSerialization.data(withJSONObject: userDicts)
            let users = try JSONDecoder().decode([UserResult].self, from: jsonData)
            print("USERS \(users)")
            completion(.success(users))
        } catch {
            completion(.failure(.badRequest("Decode failed: \(error.localizedDescription)")))
        }
    }
}

你定义的UserResult模型已经符合Decodable要求,不需要修改。

内容的提问来源于stack exchange,提问作者Jake Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:00