从 (_,_,_) 类型的抛出函数 throws -> Void 到非抛出函数类型 (NSData?, NSURLResponse?, NSError?) -> Void 的无效转换
Invalid conversion from throwing function of type (_,_,_) throws -> Void to non-throwing function type (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?) -> 无效。是在排队,让task在哪里。
谢谢
您需要按如下方式实现 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()
}
}
let jsonURL = URL(string: "https://api.whitehouse.gov/v1/petitions.json?limit=100")!
let start = Date()
jsonURL.asyncDownload { data, response, error in
print("Download ended:", Date().description(with: .current))
print("Elapsed Time:", Date().timeIntervalSince(start), terminator: " seconds\n")
print("Data size:", data?.count ?? "nil", terminator: " bytes\n\n")
guard let data = data else {
print("URLSession dataTask error:", error ?? "nil")
return
}
do {
let jsonObject = try JSONSerialization.jsonObject(with: data)
if let dictionary = jsonObject as? [String: Any],
let results = dictionary["results"] as? [[String: Any]] {
DispatchQueue.main.async {
results.forEach { print([=11=]["body"] ?? "", terminator: "\n\n") }
// self.tableData = results
// self.Indextableview.reloadData()
}
}
} catch {
print("JSONSerialization error:", error)
}
}
print("\nDownload started:", start.description(with: .current))
正如 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()
}
在Swift2中,将所有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()
}
更改代码 try-catch 中的错误类型对我有用。
"replace all NSError with ErrorType"
我写了这段代码:
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?) -> 无效。是在排队,让task在哪里。
谢谢
您需要按如下方式实现 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()
}
}
let jsonURL = URL(string: "https://api.whitehouse.gov/v1/petitions.json?limit=100")!
let start = Date()
jsonURL.asyncDownload { data, response, error in
print("Download ended:", Date().description(with: .current))
print("Elapsed Time:", Date().timeIntervalSince(start), terminator: " seconds\n")
print("Data size:", data?.count ?? "nil", terminator: " bytes\n\n")
guard let data = data else {
print("URLSession dataTask error:", error ?? "nil")
return
}
do {
let jsonObject = try JSONSerialization.jsonObject(with: data)
if let dictionary = jsonObject as? [String: Any],
let results = dictionary["results"] as? [[String: Any]] {
DispatchQueue.main.async {
results.forEach { print([=11=]["body"] ?? "", terminator: "\n\n") }
// self.tableData = results
// self.Indextableview.reloadData()
}
}
} catch {
print("JSONSerialization error:", error)
}
}
print("\nDownload started:", start.description(with: .current))
正如 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()
}
在Swift2中,将所有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()
}
更改代码 try-catch 中的错误类型对我有用。
"replace all NSError with ErrorType"