Неверное преобразование из функции бросания типа (_, _, _) throws → Void в не-бросающий тип функции (NSData?, NSURLResponse?, NSError?) → Void
Я написал этот код:
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()
}
И после обновления до XCode 7 он дает мне эту ошибку: Неверное преобразование из функции бросания типа (_, _, _) throws → Void в не-бросающий тип функции (NSData?, NSURLResponse?, NSError?) → Пустота. Он находится в строке, где задана задача.
Спасибо
Ответы
Ответ 1
Вам необходимо реализовать обработку ошибок Try Try Catch:
func getjson() {
let url = NSURL(string: "https://api.whitehouse.gov/v1/petitions.json?limit=100")!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
print("Task completed")
if let data = data {
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
dispatch_async(dispatch_get_main_queue(), {
if let results: NSArray = jsonResult["results"] as? NSArray {
self.tableData = results
self.Indextableview.reloadData()
}
})
}
} catch let error as NSError {
print(error.localizedDescription)
}
} else if let error = error {
print(error.localizedDescription)
}
}
task.resume()
}
Ответ 2
Как предложил Лео, ваша проблема заключается в том, что вы используете try
, но не внутри конструкции do
- try
- catch
, а это означает, что он указывает, что закрытие определено для того, чтобы выбросить ошибку, но поскольку он не определен как таковой, вы получаете эту ошибку.
Итак, добавьте 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()
}
Ответ 3
В Swift 2 замените все NSError
на ErrorType
Попробуйте это.
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()
}
Ответ 4
Изменение типа ошибки в пробной попытке кода работало для меня.
"заменить все NSError на ErrorType"