【问题标题】:Swift4 Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?)Swift4从“(_,_,_)抛出->()”类型的抛出函数到非抛出函数类型“(Data?,URLResponse?,Error?)的无效转换
【发布时间】:2018-02-09 19:22:40
【问题描述】:
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 错误处理有关,但无法弄清楚。

提前感谢您的帮助:)

【问题讨论】:

    标签: json swift httprequest


    【解决方案1】:

    这是你的问题:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多