2016-12-15 2 views
1

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

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() 
} 

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

Cannot invoke 'dataTask' with an argument list of type '(with: NSMutableURLRequest, completionHandler: (Data?, URLResponse?, NSError?) -> Void)'

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

+0

Xcode 8.2 не заставляет вас обновлять до Swift 3.0, вы все равно можете использовать Swift 2.3. Но Xcode 8.3 заставит вас перейти на Swift 3.x. –

ответ

2

Для Swift 3 это элект если вы проверяете 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 данные, которые нужно вызвать его внутри блока еще и с nil в качестве значения данных.

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

self.performGetRequest(url) { (data, status, error) in 
    if error != nil { 
     print(error?.localizedDescription) 
     return 
    } 
    //Use data here 
} 
+0

Спасибо @Nirav D так много за вашу помощь, но у меня есть другая проблема, как я могу назвать эту функцию performGetRequest Еще раз спасибо – bero

+0

@bero В настоящее время Mac недоступен, поможет вам завтра. –

+0

Ладно, не проблема Я жду вас и большое спасибо за вашу помощь. – bero

Смежные вопросы