Подтвердить что ты не робот

Неверное преобразование из функции бросания типа (_, _, _) 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?) → Пустота. Он находится в строке, где задана задача.

Спасибо

4b9b3361

Ответ 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"