- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
我想调用一个 API 及其应用程序的一部分,但我想确保获得我正在调用的站点的状态代码(以防止运行时错误)。我无法获取 URLResponse 的状态代码,但我可以获取 HTTPURLResponse
我使用 URLSessions 进行网络调用,当我将应用程序置于后台状态时,它总是失败。当我将应用程序置于前台状态时,URLSession 将 URLResponse 指定为 nil。 如何让它在后台
我在 SWIFT-XCode 中构建了一个小任务,尝试获取并打印一些 JSON 数据,但控制台没有向我显示任何错误或结果。也许有人可以帮助我解决这个问题?这是我的代码: let url = URL(s
我是 Swift 编程的新手,我在“let task = URLSession”上遇到错误。我研究并发现了其中一些错误,但没有一个答案对我有用。这是我的代码,第 44 行抛出这个错误 import U
我正在尝试按照 Ray Wenderlich 网站上的教程学习使用 Instruments。我相信示例代码是用 Swift 2 编写的,所以在允许运行它之前,我必须将代码迁移到最新的 Swift 版本
func DoLogin(_ email:String, _ password:String) { struct User: Decodable { let sfname: S
我是一名优秀的程序员,十分优秀!