URLSession выдает ошибку преобразования в Swift 3

#swift #xcode #swift3 #nsurlsession

#swift #xcode #swift3 #nsurlsession

Вопрос:

Я только что скачал Xcode8 и теперь ранее функциональный код:

 let Task = URLSession.sharedSession.dataTaskWithRequest(Request) {

   (data : NSData!, response : URLResponse!, error : NSError!) in

}
  

выдает ошибку:

 Cannot convert value of type '(NSData!, URLResponse!, NSError!) -> ()' to expected argument type '(Data?, URLResponse?, Error?) -> Void'
  

Что неисправно или изменилось с Xcode 2?

Ответ №1:

В сообщении об ошибке просто говорится, что компилятор хочет

 let task = URLSession.sharedSession.dataTaskWithRequest(request) {

   (data : Data?, response : URLResponse?, error : Error?) in

}
  

но вам вообще не нужны аннотации типа, что волшебным образом позволяет избежать ошибки

 let task = URLSession.sharedSession.dataTaskWithRequest(request) {

   (data, response, error) in

}
  

Однако в Swift 3 вы должны написать

 let task = URLSession.shared.dataTask(with: request) { (data, response, error) in ... }
  

Ответ №2:

Если вы даете им необязательный (‘?’), а не заставляете их, они, похоже, работают без каких-либо проблем:

 let task = URLSession.shared.dataTask(with: Request) {

    (data : Data?, response : URLResponse?, error : Error?) in

}