Проблемы со Swift3: не могу понять новый синтаксис

Вчера я обновился до Xcode 8.2, что заставило меня обновить синтаксис Swift 3.0. В моем приложении у меня есть эта функция:

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void)
{
    let request = NSMutableURLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let Session = URLSession(configuration: sessionConfiguration)

    let tasksession = Session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in
        if data != nil{
            DispatchQueue.main.async(execute: { () -> Void in
            completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)})
        }
        else
        {
            print("Connection Lost")
        }

    })
    tasksession.resume()
}

И я получаю эту ошибку:

Не удается вызвать «dataTask» со списком аргументов типа «(с: NSMutableURLRequest, completeHandler: (Data?, URLResponse?, NSError?) -> Void)»

Пожалуйста, кто-нибудь поможет мне исправить это?


person bero    schedule 15.12.2016    source источник
comment
Xcode 8.2 не заставляет вас обновляться до Swift 3.0, вы все равно можете использовать Swift 2.3. Но Xcode 8.3 заставит вас перейти на Swift 3.x.   -  person Cœur    schedule 16.12.2016


Ответы (1)


Для Swift 3 это batte, если вы отметите Apple Documentation, теперь dataTask(with:completionHandler:) будет возьмите URLRequest в качестве первого аргумента, а completionHandler замените на (Data?, URLResponse?, Error?) -> Void. Поэтому сделайте экземпляр URLRequest вместо NSMutableURLRequest и также внесите изменения в completionHandler. В Swift 3 с большинством общедоступных API они изменили NSError на Error. Так что тесто, если вы тоже используете Error.

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

    let request = URLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let Session = URLSession(configuration: sessionConfiguration)

    let tasksession = Session.dataTask(with: request) { data, response, error in
        if data != nil{
            DispatchQueue.main.async {
                completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)
            }
        }
        else
        {
            print("Connection Lost")
            DispatchQueue.main.async {
                completion(data: nil, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)
            }
        }

    }
    tasksession.resume()
}

Примечание: вам нужно вызвать completionHendler всеми возможными способами, вы не вызвали его, когда получаете nil данные, вам нужно вызвать его внутри блока else также с nil в качестве значения данных.

Редактировать. Вы можете вызвать эту функцию следующим образом.

self.performGetRequest(url) { (data, status, error) in
    if error != nil {
        print(error?.localizedDescription)
        return
    }
    //Use data here
}
person Nirav D    schedule 15.12.2016
comment
Большое спасибо @Nirav D за вашу помощь, но у меня есть еще одна проблема, как я могу вызвать эту функцию executeGetRequest Еще раз спасибо - person bero; 15.12.2016
comment
@bero В настоящее время Mac недоступен, поможет вам завтра. - person Nirav D; 15.12.2016
comment
Хорошо, нет проблем, я жду тебя, и большое спасибо за твою помощь. - person bero; 15.12.2016
comment
@bero Проверьте отредактированный ответ, как вы вызываете эту функцию. - person Nirav D; 16.12.2016
comment
Большое спасибо, это работа - person bero; 16.12.2016
comment
@bero Добро пожаловать, приятель :) - person Nirav D; 16.12.2016