func DoLogin(_ email:String, _ password:String)
{
struct User: Decodable {
let sfname: String
let slname: String
let email: String
let sid: Int
}
let url = URL(string: "http://URL")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let postString = "email=" + email + "&password=" + password + ""
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print(error!)
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print(response!)
}
if let responseString = String(data: data, encoding: .utf8){
let myStruct = try JSONDecoder().decode(User.self, from: responseString)
}
}
task.resume()
}
所以目的是解码 HTTP 响应 responseString
以便将信息保存到 User
的属性中,但是我在插入后不断弹出相同的错误解码 HTTP 响应的代码行 (myStruct
)。我觉得它与 Do Try Catch 错误处理有关,但无法弄清楚。
在此先感谢您的帮助:)
最佳答案
这是你的问题:
let myStruct = try JSONDecoder().decode(User.self, from: responseString)
的完成处理程序
URLSession.shared.dataTask(with: URLRequest, completionHandler: (Data?, URLResponse?, Error?) -> Void)
不允许抛出或重新抛出异常。如果有,签名将是这样的:
URLSession.shared.dataTask(with: URLRequest, completionHandler: (Data?, URLResponse?, Error?) throws -> Void)
(注意方法签名中的throws
)
此外,您需要确保将 responseString
更改为 data
。 decode
方法接受一个Data
对象,而不是一个String
。将 data
转换为 String
实际上根本不需要,因此您可以从代码中删除此 if
语句:
if let responseString = String(data: data, encoding: .utf8)
尝试做这样的事情:
do {
let myStruct = try JSONDecoder().decode(User.self, from: data)
//do something with myStruct
} catch let error as NSError {
//do something with error
}
或者这个:
if let myStruct = try? JSONDecoder().decode(User.self, from: data) {
//do something with myStruct
} else {
//handle myStruct being nil
}
关于json - Swift4 从 '(_, _, _) throws -> ()' 类型的抛出函数到非抛出函数类型的无效转换 '(Data?, URLResponse?, Error?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48712752/