Swift 2 iOS 9不捕获尝试崩溃,发现意外的零
我正在尝试熟悉swift2和ios9的新Swift 2 iOS 9不捕获尝试崩溃,发现意外的零,swift,nsurlsession,swift2,ios9,Swift,Nsurlsession,Swift2,Ios9,我正在尝试熟悉swift2和ios9的新do-catch语句 我的问题是,当NSURLSession发生错误时,数据参数返回nil,而error返回一些东西。在iOS 8中,这是预期的功能,我们只是使用if语句来确定数据是否为零 然而,对于docatch,有一个新的try关键字,我认为它是为了查看某个东西是否有效,如果不起作用,那么默认为catch 然而,由于数据为零,我得到了一个意外的崩溃。这是预期的功能,为什么当我的try方法失败时不调用catch 我正在使用NSURLSession从API
do-catch
语句
我的问题是,当NSURLSession发生错误时,数据参数返回nil,而error返回一些东西。在iOS 8中,这是预期的功能,我们只是使用if语句来确定数据是否为零
然而,对于do
catch
,有一个新的try
关键字,我认为它是为了查看某个东西是否有效,如果不起作用,那么默认为catch
然而,由于数据为零,我得到了一个意外的崩溃。这是预期的功能,为什么当我的try
方法失败时不调用catch
我正在使用NSURLSession从API中提取数据
我创建了一个DataTask,请求如下:
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
就在这里崩溃,因为数据!是零。。因为存在NSURLSession错误
print(jsonResult)
} catch {
print(error)
}
})
task.resume()
这是因为
catch
只捕获函数“抛出的内容”
NSJSONSerialization
抛出,但强制展开空的可选文件不会抛出,它总是崩溃
使用if let
或新的guard
功能安全地打开值
do {
if let myData = data, let jsonResult = try NSJSONSerialization.JSONObjectWithData(myData, options: []) as? NSDictionary {
print(jsonResult)
}
} catch {
print(error)
}
因此,假设我使用一个保护语句来展开数据。如果error包含和error,并且数据为nil,那么guard语句将退出当前范围,并且我不会看到我的错误。。我想看看。对吗?如果你想使用
guard
,你不必在do catch
中这样做,因此你可以在任务
中之前这样做,并从session.dataTaskWithRequest
给出的“error”变量中获益注意:catch中的“error”变量不是同一个变量,它是由catch
自动使用的通用变量。因此,在if let
语句中,如果data==nil,则不会执行try
,因此不会抛出,也不会调用catch
,所以我不会犯错误。对吗?原来的if错误!=nil{print(data)}
优于?但数据为零和NSJSONSerialization失败导致的错误不相关。:)功能与以前没有任何变化。如果允许,您可以始终使用。。。ELSE
要创建一个分支,在该分支中处理的“数据”为零,这与JSON的do try catch
有所不同。有时周一并不是最好的一天。伟大的这是有道理的。