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