我正在尝试熟悉swift 2和iOS 9的新do catch
语句
我的问题是,当NSURLSession发生错误时,data参数返回nil, error返回一些东西。在iOS 8中,这是预期的功能,我们只是使用if语句来查找数据是否为nil
然而,与do
catch
,有新的try
关键字,我认为是为了看看是否有什么工作,如果它没有那么默认为任何代码写在catch
然而,因为数据是nil,我得到一个意外的崩溃。这是预期的功能,为什么当我的try
方法失败时不调用catch
?
我正在使用NSURLSession从API提取数据。
我创建了一个dataTaskWith请求:
let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
print(request)
print(response)
print(error)
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
这里崩溃了,因为数据!为nil . .因为有一个NSURLSession错误
print(jsonResult)
} catch {
print(error)
}
})
task.resume()
这是因为catch
只捕获函数"抛出"的内容。
NSJSONSerialization
抛出,但是强制展开一个空的Optional不会,它总是崩溃。
使用if let
或新的guard
函数安全地展开您的值。
do {
if let myData = data, let jsonResult = try NSJSONSerialization.JSONObjectWithData(myData, options: []) as? NSDictionary {
print(jsonResult)
}
} catch {
print(error)
}