Ios 从(,,,)类型的抛出函数转换无效抛出->;无效为非抛出函数类型(NSData?、NSURLResponse?、NSError?)->;无效的

Ios 从(,,,)类型的抛出函数转换无效抛出->;无效为非抛出函数类型(NSData?、NSURLResponse?、NSError?)->;无效的,ios,swift,xcode7,Ios,Swift,Xcode7,我编写了以下代码: 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!, com

我编写了以下代码:

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?)的无效转换->Void。这是在排队,哪里是让任务


谢谢

您需要实现Do-Try-Catch错误处理,如下所示:

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, completionHandler: completion)
            .resume()
    }
}


正如Leo所建议的,您的问题是您使用的是
try
,但不是在
do
-
try
-
catch
构造中,这意味着它推断闭包被定义为抛出错误,但由于它没有这样定义,因此您会得到该错误

因此,添加
do
-
try
-
catch

func getjson() {
    let urlPath = "https://api.whitehouse.gov/v1/petitions.json?limit=100"
    let url = URL(string: urlPath)!
    let session = URLSession.shared
    let task = session.dataTask(with: url) { data, response, error in
        print("Task completed")

        guard let data = data, error == nil else {
            print(error?.localizedDescription)
            return
        }

        do {
            if let jsonResult = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
                if let results = jsonResult["results"] as? [Any] {
                    DispatchQueue.main.async {
                        self.tableData = results
                        self.indexTableView.reloadData()
                    }
                }
            }
        } catch let parseError {
            print("JSON Error \(parseError.localizedDescription)")
        }
    }

    task.resume()
}

在Swift 2中,将所有
n错误
替换为
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()
}

更改代码try-catch中的错误类型对我来说很有效


“用ErrorType替换所有N错误”

指出导致问题的行,并用完整准确的错误消息更新问题。您需要使用try!或者实现do try catch,但我应该在哪里使用try@LeoDabusDo try-after-try添加如果成功应该运行的代码我已经更新了完整的错误消息@rmaddy是否有办法将错误进一步传递到链的上游?因为我的“getjson”函数在一个单独的类中。我不想打印错误描述,而是在UIAlertController中向用户显示它。但是UIAlertController只能通过调用“getjson”函数从UIViewController显示。@Adarkas2302是一种异步方法,实现这一点的最简单方法是发布通知,并向需要显示警报的视图控制器添加观察者。
  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()
}