在Swift中将Kelvin转换为Celsius

时间:2016-07-05 22:30:53

标签: ios json swift double openweathermap

我正在尝试从用户当前位置检索温度。

我正在使用OpenWeatherMap中的API。问题是,他们提供默认的开尔文温度,我希望它在摄氏度。

我明白我只需要从开尔文价值中减去273.15 ....但我正在努力弄清楚在哪里这样做。

我设置标签的代码:

var jsonData: AnyObject?

func setLabels(weatherData: NSData) {

    do {

        self.jsonData = try NSJSONSerialization.JSONObjectWithData(weatherData, options: []) as! NSDictionary

    } catch {
        //handle error here

    }

    if let name = jsonData!["name"] as? String {

        locationLabel.text = "using your current location, \(name)"

    }

    if let main = jsonData!["main"] as? NSDictionary {
        if let temperature = main["temp"] as? Double {

            self.tempLabel.text = String(format: "%.0f", temperature)

        }

    }

}

任何人都可以帮我解决这个问题,因为我真的不知道从哪里开始,谢谢。

如果您需要查看更多代码,请告诉我们。

5 个答案:

答案 0 :(得分:7)

if let kelvinTemp = main["temp"] as? Double {
    let celsiusTemp = kelvinTemp - 273.15
    self.tempLabel.text = String(format: "%.0f", celsiusTemp)
}

或只是

self.tempLabel.text = String(format: "%.0f", temperature - 273.15)

答案 1 :(得分:2)

从上面的代码可以看出,在你得到温度之后,正确的地方就是这样

if let temperatureInKelvin = main["temp"] as? Double {
  let temperatureInCelsius = temperatureInKelvin - 273.15
  self.tempLabel.text = String(format: "%.0f", temperature)
}

将来,我可能会在单独的类中解析您的JSON值,并将它们存储在您稍后可以调用的模型对象中。

答案 2 :(得分:1)

下面:

self.tempLabel.text = String(format: "%.0f", temperature - 273.15)

或者你可以在这里(伪语法,因为我不太了解Swift):

if let temperature = (main["temp"] as? Double) - 273.15 {
    self.tempLabel.text = String(format: "%.0f", temperature)
}

答案 3 :(得分:1)

对于Swift 4.2

使用度量格式器。

let mf = MeasurementFormatter()

此方法将一种温度类型(开尔文,摄氏,华氏温度)转换为另一种:

  func convertTemp(temp: Double, from inputTempType: UnitTemperature, to outputTempType: UnitTemperature) -> String {
    mf.numberFormatter.maximumFractionDigits = 0
    mf.unitOptions = .providedUnit
    let input = Measurement(value: temp, unit: inputTempType)
    let output = input.converted(to: outputTempType)
    return mf.string(from: output)
  } 

用法:

let temperature = 291.0
let celsius = convertTemp(temp: temperature, from: .kelvin, to: .celsius) // 18°C 
let fahrenheit = convertTemp(temp: temperature, from: .kelvin, to: .fahrenheit) // 64°F

要输出局部温度格式,请删除行mf.unitOptions = .providedUnit

答案 4 :(得分:0)

上述便捷函数的一个简单示例(针对 Swift 5.3 进行了更新)如下所示:

func convertTemperature(temp: Double, from inputTempType: UnitTemperature, to outputTempType: UnitTemperature) -> Double {
    let input = Measurement(value: temp, unit: inputTempType)
    let output = input.converted(to: outputTempType)
    return output.value
}