我已经开始将我的一个项目转换为Swift 2,我遇到了这个问题。要在下面启动此块,完全有效try
/ catch
,实际上它是由Xcode迁移工具生成的。
do {
requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: [])
} catch var error as NSError {
requestError = error
requestData = nil
}
如果我在闭包中使用相同的代码,例如dataTaskWithRequest
,我会收到错误。错误发生在任务分配,但它是导致它的问题。以下也可以,但我没有捕获错误。
let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, taskError) -> Void in
if taskError != nil {
NSLog("Error making request: " + taskError!.localizedDescription)
}
else {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
if let parseJSON = json as NSDictionary? {
// do some parsing here
}
}
catch {
NSLog("Error in JSON serialization")
}
}
})
task.resume()
但如果我尝试用以下方法捕获错误:
} catch let e as NSError {
我收到此错误:
投掷'(_,_,_)类型的函数的转换无效 - > Void'到非投掷函数类型'(NSData?,NSURLResponse?, NSError?) - >无效“
我确实发现了:
} catch _ {
但是很有用,但是很有用。
我错过了什么或者我应该提交错误吗?
(这是Xcode 7b5)
答案 0 :(得分:3)
dataTaskWithRequest
的完成处理程序并非旨在抛出JSONObjectWithData
NSJSONSerialization
之类的错误,其签名为:
class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject
执行以下操作(与您尝试过的相同):
catch _
但那不会给我们提供有关错误的详细信息,即来自class func JSONObjectWithData
的错误。
因此,我们需要一种方法来使用不可投掷的dataTaskWithRequest
,同时保留投掷的JSONObjectWithData
。
我尝试了以下内容:
catch let error as NSError
{
//error specific to JSON serialization
NSLog("Error in JSON serialization \(error)")
}
catch
{
//exhaust the error
NSLog("Some error")
}