我已经开始将我的一个项目转换到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)
1条答案
按热度按时间dly7yett1#
dataTaskWithRequest
的完成处理程序不是设计为抛出类似于NSJSONSerialization
的JSONObjectWithData
的错误,其签名为:执行以下操作将有效(与您尝试的操作相同):
但是这并不能给予我们任何关于抛出的错误的细节,也就是说,
class func JSONObjectWithData
。因此,我们需要一种方法来使用不可抛出的
dataTaskWithRequest
,同时保留抛出-JSONObjectWithData
的dataTaskWithRequest
。我已尝试以下方法: