【发布时间】:2020-08-27 03:12:17
【问题描述】:
我想发出一个网络请求,其中我可以控制响应是 JSON 原始值 [String: Any 或 Decodable。
示例如下:
func reqest<T>(endpoint: EndPoint, completion: @escaping (Result<T, Error>) -> Void) {
session.dataTask(with: request) { (data, response, error) in
if T.self is Decodable.Type {
try? JSONDecoder().decode(T.self, from: data)
} else {
try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
}
}.resume()
}
然后当我想要 JSON 值时,我只需调用 T 作为 [String: Any] 或使用任何模型确认 Decodable 协议。
问题是针对这一行的:
try? JSONDecoder().decode(T.self, from: data)
如何将T 转换为Decodable?
我知道使用:
func reqest<T: Decodable >(endpoint: EndPoint, completion: @escaping (Result<T, Error>) -> Void)
但[String: Any] 不是Decodable。
或者任何更好的解决方案来实现我想要的?谢谢。
【问题讨论】:
-
[String: Any]不符合Decodable。我认为您无法为两者创建一个方法。 -
这种运行时的类型检查非常unswifty。声明两个具有不同约束的方法。忽略任何错误都是非常糟糕的做法。而
.mutableLeaves在 Swift 中毫无意义。