斯威夫特 2 尝试/捕捉
Posted
技术标签:
【中文标题】斯威夫特 2 尝试/捕捉【英文标题】:Swift 2 try/catch 【发布时间】:2015-08-20 23:43:50 【问题描述】:我已经开始将我的一个项目转换为 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
我收到此错误:
'(_, _, _) throws 类型的抛出函数的无效转换 -> 无效'到非抛出函数类型'(NSData?,NSURLResponse?, NSError?)-> 无效'
我确实发现了:
catch _
有效,但对我有很多好处。
我是遗漏了什么还是应该提交错误?
(这是 Xcode 7b5)
【问题讨论】:
【参考方案1】:dataTaskWithRequest
的完成处理程序并非像NSJSONSerialization
的JSONObjectWithData
那样抛出错误,其签名为:
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")
【讨论】:
完美。除非我抛出自定义 ErrorType,否则我不会想到这样做。谢谢!!以上是关于斯威夫特 2 尝试/捕捉的主要内容,如果未能解决你的问题,请参考以下文章
尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS