swift2 Swift 2试跳/接球

qoefvg9y  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(159)

我已经开始将我的一个项目转换到Swift 2,我遇到了这个问题。下面的代码块是完全有效的try/catch,事实上它是由Xcode迁移工具生成的。

do {
       requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: [])
} catch var error as NSError {
      requestError = error
      requestData = nil
}

如果我在闭包中使用相同的代码,比如dataTaskWithRequest,我会得到一个错误。错误出现在任务分配中,但是是catch引起的。下面的代码也可以工作,但是我没有捕获错误。

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 {

我得到这个错误:
从类型为'(,_)throws -〉Void'的引发函数到非引发函数类型'(NSData?,NSURLResponse?,NSError?)-〉Void'的转换无效
我确实发现:

} catch _ {

但对我有很多好处。
我是不是遗漏了什么,或者我应该提交一个错误?
(This是Xcode 7 b5)

dly7yett

dly7yett1#

dataTaskWithRequest的完成处理程序不是设计为抛出类似于NSJSONSerializationJSONObjectWithData的错误,其签名为:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject

执行以下操作将有效(与您尝试的操作相同):

catch _

但是这并不能给予我们任何关于抛出的错误的细节,也就是说,class func JSONObjectWithData
因此,我们需要一种方法来使用不可抛出的dataTaskWithRequest,同时保留抛出-JSONObjectWithDatadataTaskWithRequest
我已尝试以下方法:

catch let error as NSError
{
     //error specific to JSON serialization
     NSLog("Error in JSON serialization \(error)")
}
catch
{
     //exhaust the error
     NSLog("Some error")
}

相关问题