无法将服务器返回数据解码为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
相关产品推荐
相关产品推荐

