json - Swift4 从 '(_, _, _) throws -> ()' 类型的抛出函数到非抛出函数类型的无效转换 '(Data?, URLResponse?, Error?)

标签 json swift httprequest

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 更改为 datadecode 方法接受一个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/

相关文章:

java - Spring Controller - 将 JSON 属性映射到外键实体

php - 使用 JSON 的 MySQL 查询

javascript - 如何在 Node.js 中使用 MySQL 查询更新 MySQL 数据库中的 JSON 记录?

ios - 如何通过 api 从 iOS 应用程序发出 http 请求

java - 如何在 Node js/Java 中捕获网络调用?

ios - 从NSDictionary检索 key

swift - Gray Matcher 获取多个元素的文本匹配同一个灰色匹配器

swift - 每 4 秒后调用一个方法,但同时 tableview 不加载?

swift - 面向协议(protocol)编程和面向对象编程的区别与示例

java - 如何在下一个 Activity 中显示响应