ios swift xcode7

ios - Conversión no válida de la función de lanzamiento de tipo(_,_,_) lanzamientos-> Void a tipo de función de no lanzar(NSData ?, NSURLResponse ?, NSError?)-> Void



swift xcode7 (4)

He escrito este código:

func getjson() { let urlPath = "https://api.whitehouse.gov/v1/petitions.json?limit=100" let url = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in print("Task completed") if(error != nil) { print(error!.localizedDescription) } let err: NSError? if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { if(err != nil) { print("JSON Error /(err!.localizedDescription)") } if let results: NSArray = jsonResult["results"] as? NSArray { dispatch_async(dispatch_get_main_queue(), { self.tableData = results self.Indextableview.reloadData() }) } } }) task.resume() }

Y después de actualizar a XCode 7 me da este error: la conversión no válida de la función de lanzamiento de tipo (_, _, _) lanza -> Void a tipo de función de no lanzar (NSData, NSURLResponse ?, NSError?) -> Void. Está en línea, donde está la tarea.

Gracias


Cambiar el tipo de error en el código try-catch funcionó para mí.

"Reemplace todos los NSError con ErrorType"


Como sugirió Leo, su problema es que está usando try , pero no dentro del constructo do - try - catch , lo que significa que infiere que el cierre está definido para lanzar el error, pero como no está definido como tal, obtener ese error

Entonces, agregue do - try - catch

func getjson() { let urlPath = "https://api.whitehouse.gov/v1/petitions.json?limit=100" let url = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!) { data, response, error in print("Task completed") guard data != nil && error == nil else { print(error?.localizedDescription) return } do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { if let results = jsonResult["results"] as? NSArray { dispatch_async(dispatch_get_main_queue()) { self.tableData = results self.Indextableview.reloadData() } } } } catch let parseError as NSError { print("JSON Error /(parseError.localizedDescription)") } } task.resume() }


Debe implementar el manejo de errores Do Try Catch de la siguiente manera:

import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true extension URL { func asyncDownload(completion: @escaping (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> ()) { URLSession.shared.dataTask(with: self) { print("Task completed") completion($0, $1, $2) }.resume() } }

let jsonURL = URL(string: "https://api.whitehouse.gov/v1/petitions.json?limit=100")! jsonURL.asyncDownload { data, response, error in guard let data = data, let dict = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any], let results = dict["results"] as? [[String: Any]] else { print("error:", error ?? "nil") return } DispatchQueue.main.async { print(results) // self.tableData = results // self.Indextableview.reloadData() } }


En Swift 2, reemplace todos los NSError con NSError

Prueba esto.

class func fetchWeatherForLocation(locationCode: String = "", shouldShowHUD: Bool = false, completionHandler: (data: NSDictionary?, error: ErrorType?) -> ()) { let url = NSURL(string: "myurl") let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in if let dataWithKey = data { do { let jsonForDataWithTemprature = try NSJSONSerialization.JSONObjectWithData(dataWithKey, options:NSJSONReadingOptions.MutableContainers) guard let arrayForDataWithKey :NSArray = jsonForDataWithTemprature as? NSArray else { print("Not a Dictionary") return } let dictionaryWithTemprature = arrayForDataWithKey.firstObject as! NSDictionary completionHandler(data: dictionaryWithTemprature, error: nil) } catch let JSONError as ErrorType { print("/(JSONError)") } } } task.resume() }