-1

I got Optional(3.48) in simulator and don't understand how to get this value without "Option()" just value. In tableview every cell same but I need just 5 cells with different info for every day. The data parsed with json. I provided my code and hope that anybody can help me. I will be pleased for any help.

import UIKit
import Foundation

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var cityNameLabel: UILabel!
@IBOutlet weak var temperatureLabel: UILabel!
@IBOutlet weak var weatherNowLabel: UILabel!
@IBOutlet weak var dailyWeatherTableView: UITableView!

var responseModel: WeatherForecast?
var degreeSymbol = "º"


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    currentWeatherRequest()
    dailyWeatherTableView.delegate = self
    dailyWeatherTableView.dataSource = self
    updateView()
    //self.dailyWeatherTableView.automatic
}
func currentWeatherRequest() {
let session = URLSession.shared
    let weatherURL = URL(string: "http://api.openweathermap.org/data/2.5/forecast?q=cityname?&units=metric&APPID=")!
let dataTask = session.dataTask(with: weatherURL) { (data: Data?,response: URLResponse?,error: Error?) in
        if let error = error {
            print("Error:\n\(error)")

        } else {
            if let jsonData = data {

                do {
                    let dataString = String(data: jsonData, encoding: String.Encoding.utf8)
          print("Daily weather data:\n\(dataString!)")
                let decoder = JSONDecoder()
                    self.responseModel = try decoder.decode(WeatherForecast.self, from: jsonData)

                    DispatchQueue.main.async {
                        self.cityNameLabel.text = self.responseModel?.city.name
                       // self.temperatureLabel.text = String(describing: self.responseModel?.list[0].main.feelsLike)
                       self.weatherNowLabel.text = (self.responseModel?.list[0].weather[0].main).map { $0.rawValue }
                        self.dailyWeatherTableView.reloadData()
                        self.updateView()
                    }

                } catch let error {
                  print("Error: \(error)")
                }
            }else {
            print("Error: did not receive data")

        }
        }
    }
    dataTask.resume()

  }
  public   func updateView(){
    self.temperatureLabel.text = String(describing: responseModel?.list[0].main.temp)
  }
  public    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return responseModel?.list.count ?? 5
  }



  public     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       guard let cell = tableView.dequeueReusableCell(withIdentifier: "FullDayWeatherCell", for: indexPath) as? DailyWeatherViewCell else { return UITableViewCell() }
        cell.minMaxTempLabel.text = "\(String(describing: responseModel?.list[0].main.tempMin))\(self.degreeSymbol) - \(String(describing: responseModel?.list[0].main.tempMax))\(self.degreeSymbol)"

        cell.weatherLabel.text = (self.responseModel?.list[0].weather[0].main).map { $0.rawValue }
        return cell


        }
 private  func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableView.automaticDimension
}

}

1 Answers1

1

Please learn on Optionals before posting basic questions,

https://developer.apple.com/documentation/swift/optional

temp is an Optional which may or may not have a value.

let list = responseModel?.list[0]
if let temp = list.main.temp {
 // temp is an Int
} else {
 // No value
}
Harish
  • 2,496
  • 4
  • 24
  • 48