I was learning to parse OpenWeather API in Xcode and got a little confused. So I have to make a get request to receive a weather report from OpenWeather and than display it in the labels that I prepared.
I have the main VC with label outlets
class ViewController: UIViewController {
@IBOutlet weak var weatherDescriptionlabel: UILabel!
@IBOutlet weak var cityLabel: UILabel!
@IBOutlet weak var currentWeatherLabel: UILabel!
var Data: [DataClass] = []
var cityName: String = ""
var currentWeather: Int = 0
var weatherDescription: String = ""
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
dataLoader().loadData()
}
}
I have a separate class to "prepare" JSON data for transmission
class WeatherDataClass {
let cityName: String
let currentWeather: Int
let weatherDescription: String
init (data: NSDictionary){
let cityName = data["name"] as? String
let currentWeather = data["temp"] as? String
let weatherDescription = data["description"] as? String
self.cityName = cityName!
self.currentWeather = Int(currentWeather!)!
self.weatherDescription = weatherDescription!
}
}
and a DataLoader which is calling API
protocol dataLoaderDelegate{
func load( data: [WeatherDataClass] ) }
class dataLoader{
var delegate: dataLoaderDelegate?
var Url = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=f2a7ca3bd41dfa2efab0ad667aafe1df")!
func loadData(){
let url = Url
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data,
let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments),
let jsonDict = json as? NSDictionary{
var weather: [WeatherDataClass] = []
for (_,data) in jsonDict where data is NSDictionary{
if let x = WeatherDataClass(data: data as! NSDictionary){
weather.append(x)
}
}
self.delegate?.load(data: weather)
} }
task.resume()
}
}
The problem is data from JSONdict doesn't wrap to NSDictionary It remains Any and giving me an error
What am I doing wrong? Thanks for the help in advance