感谢您提前获得任何帮助。
url会话与连接完美配合,它将错误打印为nil。但没有它它打印.localizedDescription就好了,并向我显示正确的错误,但随后继续执行do {try}并在try行中出现此错误:
线程6:致命错误:打开时出乎意料地发现nil 可选值
现在我甚至不确定这是否与错误处理有关。感谢任何帮助,了解最新情况或只是解决问题!
func getData(completion: (() -> ())?) {
let urlString = URL(string: "https://api.coinmarketcap.com/v1/ticker/")
URLSession.shared.dataTask(with: urlString!, completionHandler: { (data, response , error) in
print("before entering do-try-catch", error?.localizedDescription)
do {
//create Dictionary
print("downloading content")
self.coinData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]]
//set connection status
self.connection = true
//update tableView
DispatchQueue.main.async {
completion?()
}
} catch {
print("catch", error.localizedDescription)
//set connection status
self.connection = false
//update tableView
DispatchQueue.main.async {
completion?()
}
}
}).resume()
}
答案 0 :(得分:2)
Thread 6: Fatal error: Unexpectedly found nil while unwrapping an Optional value
是初学者的常见问题。
您尝试使用不存在的数据。
例如,在您的代码中,您强制执行try JSONSerialization.jsonObject(with: data!)
当data
为nil
时,代码将崩溃。
开头URLSession.shared.dataTask(with: urlString!, completionHandler: { (data, response, error) {}
当urlString
不是有效的网址时,代码将崩溃。 (在这种情况下,网址似乎有效)。
有关详细信息,请查看此处: https://stackoverflow.com/a/24034551/4420355
尝试以下剪切它应该工作
if let data = data {
self.coinData = try JSONSerialization.jsonObject(with: data) as? [[String:Any]]
//... work with coinData
}
答案 1 :(得分:1)
崩溃的原因是因为data
是可选的,它应该是nil或具有某些值。在线
self.coinData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]]
编译器认为:
让我们来看看并解开这个Optianal变量。但它的nil
,没有"没有"!那我该怎么解开呢?让我们崩溃并抛出致命错误信息。
如何通过可选绑定轻松避免这种情况:
if let data = data {
....do something with data
} else {
...print error message
}
有关更多信息,请查看这个精彩的答案。 https://stackoverflow.com/a/32170457/3046686