表达式的类型是不明确的,dataTask中没有更多的上下文

时间:2017-04-04 12:43:39

标签: swift

我正在将我的代码转换为swift 3,但得到"表达式的类型是不明确的,没有更多的上下文"以下代码中的错误。

open class func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) {

    var request = URLRequest(url: targetURL)
    request.httpMethod = "GET"
    let sessionConfiguration = URLSessionConfiguration.default
    let session = URLSession(configuration: sessionConfiguration)
    let task = session.dataTask(with: request) { (data, response, error) in
        DispatchQueue.main.async(execute: {
            completion(data, response.statusCode,error)
        })
    }
    task.resume() 
}

2 个答案:

答案 0 :(得分:1)

编译器希望Error不是NSError

此外,在Swift 3中省略了完成处理程序中的参数标签,如果你的实际意思是非可选的,则不要传递IUO *参数:

open class func performGetRequest(_ targetURL: URL, completion: @escaping (Data?, Int, Error?) -> Void) {

最后,在这种情况下你不需要URLRequest,GET是默认值,所以只需将URL传递给dataTask并删除与请求相关的两行。

(*)Implicit Unwrapped Optional

答案 1 :(得分:1)

您的代码首先出现两个问题response.statusCode,响应的类型为URLResponse且它没有属性statusCode,因此您需要输入强制转换为{{ 3}}获取HTTPURLResponse。第二个来自Swift 3使用原生Error而不是NSError,所以你的整个代码就是这样。

open class func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: Error?) -> Void) {

    var request = URLRequest(url: targetURL)
    request.httpMethod = "GET"
    let sessionConfiguration = URLSessionConfiguration.default
    let session = URLSession(configuration: sessionConfiguration)
    let task = session.dataTask(with: request) { (data, response, error) in
        DispatchQueue.main.async(execute: {
            completion(data, (response as! HTTPURLResponse).statusCode,error)
        })
    }
    task.resume()
}