由于某种原因,每当我尝试使用self.infoLabel.text = String(temp!)
代码块内的DispatchQueue
用当前温度更新标签时,都会收到以下致命错误消息:
unexpectedly found nil while unwrapping an Optional value.
如果有人可以帮助我找出下面的代码为什么不起作用,我将不胜感激。谢谢。
func getCurrentTemp(city: String){
let weatherRequestURL = URL(string: "\(openWeatherMapBaseURL)?APPID=\(openWeatherMapAPIKey)&q=\(city)")!
// The data task retrieves the data.
URLSession.shared.dataTask(with: weatherRequestURL) { (data, response, error) in
if let error = error {
// Case 1: Error
print("Error:\n\(error)")
}
else {
//print("Raw data:\n\(data!)\n")
//let dataString = String(data: data!, encoding: String.Encoding.utf8)
//print("Human-readable data:\n\(dataString!)")
do {
// Try to convert that data into a Swift dictionary
let weather = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String:AnyObject]
if let main = weather["main"] as? [String: Any] {
let temp = main["temp"] as? Double
print("temp\(temp!)")
DispatchQueue.main.sync(execute: {
self.infoLabel.text = String(temp!)
})
//return temp as? String
//let temp_max = main["temp_max"] as? Double
//print("temp\(temp_max!)")
//let temp_min = main["temp_min"] as? Double
//print("temp\(temp_min!)")
}
}
catch let jsonError as NSError {
// An error occurred while trying to convert the data into a Swift dictionary.
print("JSON error description: \(jsonError.description)")
}
}
}
.resume()
}
最佳答案
这里有两种可能性:1)temp为nil(并且不应该是因为您已经在上面的print语句中强行解开它)2)或infoLabel为nil,这发生在断开出口连接时。
它易于检查;在您的分配上方创建一个断点,然后在调试控制台中键入:
po self.infoLabel
看看是否为零。要采取良好措施,还应检查温度。
您还可以添加打印语句以检查self.infoLabel或断言。