【发布时间】:2023-04-02 16:40:01
【问题描述】:
我对 Swift 非常陌生,并且在构建一个使用名为 openweathermap.org 的网站的 API 的天气应用程序时遇到了麻烦。当用户输入一个城市并单击“提交”时,他们应该能够看到一个显示天气描述的标签。
JSON 中的结果是:
(
{
description = haze;
icon = 50d;
id = 721;
main = Haze;
},
{
description = mist;
icon = 50d;
id = 701;
main = Mist;
}
)
在尝试调试时,我使用了代码:print(jsonResult["weather"]!),这让我可以看到上面的 JSON 详细信息。但是,当我尝试获取天气描述时,我似乎无法让它工作。
我的目标:我试图让天气描述显示在我的应用程序上。我目前收到错误消息:不能对“任何”类型的非可选值使用可选链接。您的帮助将不胜感激!
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var cityTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!
@IBAction func submit(_ sender: AnyObject) {
// getting a url
if let url = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=" + (cityTextField.text?.replacingOccurrences(of: " ", with: "%20"))! + ",uk&appid=08b5523cb95dde0e2f68845a635f14db") {
// creating a task from the url to get the content of that url
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("error")
} else {
print("no error")
if let urlContent = data {
do {
let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:Any]
//print(jsonResult["weather"]!)
if let description = jsonResult["weather"]??[0]["description"] as? String {
DispatchQueue.main.sync(execute:{
self.resultLabel.text = description
})
}
} catch {
print("JSON processing failed")
}
}
}
}
task.resume()
} else {
resultLabel.text = "Couldn't find weather for that city. Please try a different city."
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
【问题讨论】:
-
这里有两个问号(在天气之后):
jsonResult["weather"]??[0]["description"]尝试删除其中一个,看看是否能让你更进一步 -
这篇文章值得一读:developer.apple.com/swift/blog/?id=37(我知道你可能已经阅读了足够多的书,但是这篇文章给出了 - 我认为 - 一个很好的介绍,介绍了在 Swift 中使用可选的初始化程序解析 JSON例如)
-
@pbodsk 感谢您的提示!
-
@pbodsk 我一定会阅读那篇文章。谢谢! :-)