【发布时间】:2017-12-07 13:35:52
【问题描述】:
,Swift 4 如何在方法参数中传递Decodable Struct 并在JSONDecoder() 中解析它?
错误:
不能使用类型为 '(Decodable, 来自:数据)'
struct JsonRespons: Codable {
let uid: String
let msisdn: String
let APK: String
let fname: String
let lname: String
}
struct JsonResponsError: Decodable {
let uid: String
let error: String
}
extension UIView {
func phoneAuth(serverApi path:String, jsonStruct:Codable){
let jsonUrlString = Globals.JOSN_API_URL + path
guard let url = URL(string: jsonUrlString) else {
return
}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard err == nil else {
return
}
guard let data = data else { return }
do {
let result = try JSONDecoder().decode(jsonStruct.self, from: data)
self.handleJsonResult(resalt: result as AnyObject)
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
func handleJsonResult(resalt:AnyObject){
print(resalt)
}
}
【问题讨论】:
-
目前还不清楚您要在这里实现什么。看起来您希望能够传入 arbitrary
Decodable类型的实例,然后根据原始实例的动态类型将一些数据解码为新实例。但你到底为什么想要那个?之后你打算如何使用result? -
@Hamish 编辑了示例代码我将结果作为方法中的参数传递
-
用
let result = try JSONDecoder().decode(JsonRespons.self, from: data)替换let result = try JSONDecoder().decode(jsonStruct.self, from: data)让我知道它有效 -
@PrashantTukadiya 是的,它有效,我想将 Struct 作为参数传递,例如
phoneAuth("https://MY_API", JsonRespons.self) -
@VakhtangiBeridze 你应该在你的问题中说清楚;)在这种情况下你不需要
Codable参数,你需要一个通用占位符T : Decodable并有一个参数@987654331 @.