Swift中HttpPOST请求后Response无法赋值给字典的原因咨询
错误原因及解决办法
错误原因
你定义的asd是[String: Any]类型的字典,但通过JSONDecoder解析接口响应后得到的response是自定义的Response结构体实例——Swift是强类型语言,完全不同的类型不能直接赋值,所以抛出类型不匹配的错误。
解决办法
方案一:推荐——修改asd的类型为Response?
直接把全局变量asd的类型改成你的Response结构体的可选型,这样就能直接赋值解析后的实例,还能享受结构体的类型安全:
// 替换原来的Dictionary<String, Any>定义 public var asd: Response?
之后赋值代码asd = response就能正常运行,后续访问响应数据时可以直接用asd?.logOk、asd?.token这种写法,比字典更直观不易出错。
方案二:如果必须用字典——将Response实例转为字典
如果业务确实需要字典类型,可以把解析后的Response实例重新编码为Data,再转成字典:
do { let response = try JSONDecoder().decode(Response.self, from: data) // 先把Response转成Data,再转成字典 let responseData = try JSONEncoder().encode(response) if let dict = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] { asd = dict } print("SUCCESS: \(response)") } catch { print(error) }
不过这种方式多了一次编码解码的开销,不如直接用结构体高效规范。
内容的提问来源于stack exchange,提问作者Alms
相关产品推荐
相关产品推荐

