【发布时间】:2021-04-13 18:04:10
【问题描述】:
我尝试解码天气 api
这是我的结构类weatherModal:
import Foundation
struct WeatherModel:Decodable{
var main:Main?
}
struct Main:Decodable {
var temp : Double?
var feels_like : Double?
var temp_min:Double?
var temp_max:Double?
var pressure , humidity: Int?
}
我正在尝试学习协议。所以这是一个 make api 调用管理器类:
protocol WeatherManagerProtocol:AnyObject {
func weatherData(weatherData:WeatherModel)
}
class WeatherManager{
var weather : WeatherModel?
weak var delegate :WeatherManagerProtocol?
public func callWeather(city:String) {
let url = "http://api.openweathermap.org/data/2.5/weather?q=\(city)&appid=1234"
URLSession.shared.dataTask(with:URL(string: url)!) { (data, response, err) in
if err != nil {
print(err!.localizedDescription)
} else {
do {
self.weather = try JSONDecoder().decode(WeatherModel.self, from: data!)
self.delegate?.weatherData(weatherData: self.weather!)
} catch {
print(error.localizedDescription)
}
}
}.resume()
}
}
在我的ViewController 中,我想做的是用户在textfield 上写下城市名称,如果用户单击进程按钮,则打印有关天气的信息。
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
var weatherManager = WeatherManager()
var data : WeatherModel?
override func viewDidLoad() {
super.viewDidLoad()
weatherManager.delegate = self
// Do any additional setup after loading the view.
}
@IBAction func processButtonClicked(_ sender: Any) {
if textField.text != "" {
weatherManager.callWeather(city: textField.text ?? "nil")
print(data?.main?.humidity) // it print nil
} else{
print("empty")
}
}
extension ViewController: WeatherManagerProtocol{
func weatherData(weatherData: WeatherModel) {
self.data = weatherData
print(self.data.main)
// in here I can show my data
}
}
当我点击进程按钮时,它总是打印 nil。为什么 ?我做错了什么?
【问题讨论】:
-
我改进了您的代码格式(缩进,Xcode 可以自动为您执行此操作),对于未来的问题,请确保您也这样做,这样您的代码将更容易被我们所有人阅读将获得更多、更快、更好的答案
-
异步方法就像打电话订购披萨一样。一旦你打完电话,你就没有披萨了。你可能在未来的某个时候得到一个披萨。
-
谢谢,我会注意的。
标签: ios swift swift-protocols